Spring事务内方法调用自身事务 增强的三种方式
2020-12-13 04:53
标签:结果 相关 注入 mamicode 使用 lin auto call lse ServiceA.java文件: 查看Spring Tx的相关日志: 可以看到只创建了一个事物ServiceA.service方法的事务,但是callSelf方法却没有被事务增强; 分析原因:Spring事务生成的对象也是被Cglib或JDK代理的对象,就区别于该对象本身了, 代理的对象执行方法之前会走拦截器链,就不能同this方法. 解决方案: 验证输出结果: 确实初始化了callSelf的事务; 2.之前Aop可以将代理对象暴露到当前线程局部变量中; 通过尝试发现,SpringTx也可以使用该配置,将创建的对象加入到当前线程局部变量; 也许觉得SpringAop和SpringTx不一样啊,但其实两者都实现了AbstractAutoProxyCreator类,同样设置expose-proxy也能生效,绑定到线程局部变量上; 调用方式如下: 验证输出结果:可以看到确实 callSelf方法也被Spring事务增强到了. 3.按照道理来说tx:annotation-driven标签应该也有expose-proxy属性,但是很不幸: 查看AopNamespaceUtils的useClassProxyingIfNecessary方法: Line 91-94行是用来解析标签时候定义expose-proxy、proxy-target-class两个属性,Aop以及Tx都会调用这个方法, 问题就是这里了, 标签约束里有expose-proxy, 那可以解析,但是 改动下解析Tx标签时,将expose-proxy设置为true; (此处涉及到改动源代码,jar包是无法直接修改的,我修改的Spring的源码,如果需要导入Spring的jar包 然后在修改之后导出成jar包) 验证下输出结果: 可以看到也实现了调用自身方法, 其实和方法二应该是一个意思; Spring事务内方法调用自身事务 增强的三种方式 标签:结果 相关 注入 mamicode 使用 lin auto call lse 原文地址:https://www.cnblogs.com/jtlgb/p/11124770.html
文章标题:Spring事务内方法调用自身事务 增强的三种方式
文章链接:http://soscw.com/index.php/essay/30190.html