Spring事务内方法调用自身事务 增强的三种方式

本文探讨了在Spring框架中如何解决事务管理下服务类调用自身方法的问题,提供了三种解决方案:通过@Autowired注入自身、使用配置暴露代理对象及修改源码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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事务增强到了.

 

 

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包)

 

验证下输出结果: 可以看到也实现了调用自身方法, 其实和方法二应该是一个意思;

   附上笔记地址:

  https://files.cnblogs.com/files/lvbinbin2yujie/Spring%E4%BA%8B%E5%8A%A1%E6%96%B9%E6%B3%95%E8%B0%83%E7%94%A8%E8%87%AA%E8%BA%AB.rar

 

转载于:https://www.cnblogs.com/lvbinbin2yujie/p/10251787.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值