@Transacitonal注解不生效之spring中expose-proxy的作用与原理

几年前记得整理过,@Transacitonal注解的方法被另外一个方法调用的时候,事务是不生效的,其原因在于spring @Transactional是通过动态代理实现的,可以参见https://blog.csdn.net/yangquanwa/article/details/88578357

如果大量代码已经这么写了,这个时候抽取出去不现实,怎么办呢?

答案就是在<aop:aspectj-autoproxy />中设置expose-proxy属性为true暴露代理。如下:

<aop:aspectj-autoproxy expose-proxy=“true”> ,然后使用AopContext.currentProxy()获取当前代理,将this.b()改为((UserService)AopContext.currentProxy()).b(),这样就生效了。完整的例子如下:

复制代码
public interface UserService{
    public void a();
    public void a();
}

public class UserServiceImpl implements UserService{
    @Transactional(propagation = Propagation.REQUIRED)
    public void a(){
        this.b();
    }
    @Transactional(propagation = Propagation.REQUIRED_NEW)
    public void b(){
        System.out.println("b has been called");
    }
}
复制代码

 对应的spring boot注解为@EnableAspectJAutoProxy(exposeProxy=true)

posted @   zhjh256  阅读(3621)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2016-12-13 mysql 5.7.17发布
2016-12-13 rabbitmq connection/channel/consumer/queue的数量关系详细分析
2016-12-13 rabbitMQ publish丢包分析
点击右上角即可分享
微信分享提示