ServiceA.java文件:java
查看Spring Tx的相關日誌: 能夠看到只建立了一個事物ServiceA.service方法的事務,可是callSelf方法卻沒有被事務加強;this
分析緣由:Spring事務生成的對象也是被Cglib或JDK代理的對象,就區別於該對象自己了,spa
代理的對象執行方法以前會走攔截器鏈,就不能同this方法.線程
解決方案:3d
驗證輸出結果: 確實初始化了callSelf的事務;代理
2.以前Aop能夠將代理對象暴露到當前線程局部變量中;日誌
<aop:aspectj-autoproxy expose-proxy="true"/>對象
經過嘗試發現,SpringTx也可使用該配置,將建立的對象加入到當前線程局部變量;blog
也許以爲SpringAop和SpringTx不同啊,但其實二者都實現了AbstractAutoProxyCreator類,一樣設置expose-proxy也能生效,綁定到線程局部變量上;事務
調用方式以下:
驗證輸出結果:能夠看到確實 callSelf方法也被Spring事務加強到了.
3.按照道理來講tx:annotation-driven標籤應該也有expose-proxy屬性,可是很不幸:
<tx:annotation-driven>標籤確實不容許expose-proxy屬性設置,有proxy-target-class屬性;
查看AopNamespaceUtils的useClassProxyingIfNecessary方法:
Line 91-94行是用來解析標籤時候定義expose-proxy、proxy-target-class兩個屬性,Aop以及Tx都會調用這個方法, 問題就是這裏了, <aop:aspectj-autoproxy>標籤約束裏有expose-proxy,
那能夠解析,可是<tx:annotation-driven>標籤沒有expose-proxy我解析啥子呢,
改動下解析Tx標籤時,將expose-proxy設置爲true; (此處涉及到改動源代碼,jar包是沒法直接修改的,我修改的Spring的源碼,若是須要導入Spring的jar包 而後在修改以後導出成jar包)
驗證下輸出結果: 能夠看到也實現了調用自身方法, 其實和方法二應該是一個意思;