Spring事务内⽅法调⽤⾃⾝事务增强的三种⽅式ServiceA.java⽂件:
查看Spring Tx的相关⽇志:  可以看到只创建了⼀个事物ServiceA.service⽅法的事务,但是callSelf⽅法却没有被事务增强;
分析原因:Spring事务⽣成的对象也是被Cglib或JDK代理的对象,就区别于该对象本⾝了,
代理的对象执⾏⽅法之前会⾛链,就不能同this⽅法.
解决⽅案:
1. 使⽤Autowired注解将⾃⾝注⼊,然后调⽤注⼊属性的⽅法;
验证输出结果:  确实初始化了callSelf的事务;
2.之前Aop可以将代理对象暴露到当前线程局部变量中;
<aop:aspectj-autoproxy expose-proxy="true"/>
通过尝试发现,SpringTx也可以使⽤该配置,将创建的对象加⼊到当前线程局部变量;
也许觉得SpringAop和SpringTx不⼀样啊,但其实两者都实现了AbstractAutoProxyCreator类,同样设置expose-proxy也能⽣效,绑定到线程局部变量上;调⽤⽅式如下:
验证输出结果:可以看到确实 callSelf⽅法也被Spring事务增强到了.
spring framework扩展点
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包)
验证下输出结果: 可以看到也实现了调⽤⾃⾝⽅法, 其实和⽅法⼆应该是⼀个意思;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。