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包)
验证下输出结果: 能够看到也实现了调用自身方法, 其实和方法二应该是一个意思;