我的bug呢 2024-02-25 22:10 采纳率: 57.1%
浏览 12
已结题

@Transactional注解修饰的方法没有生成代理类

这个事务也回滚了,但是这个Service类为啥不是代理对象呢,看着像原生类

    @Override
    @Transactional
    public Result transaction() {
        demo1();
        return null;
    }

    public void demo1(){
            userMapper.test1(1, "dd");
            demo2();
            throw new RuntimeException();
//        return null;
        }
    public void demo2() {
        userMapper.test2(2, "liu2");
    }

img

  • 写回答

4条回答 默认 最新

  • 学而思sgbfq 2024-02-26 11:46
    关注

    一般在spring boot中,该类如果带有@Transactional,是通过cglib生成的代理类,它是继承实现的动态代理。我这有一个生成的代理类的class。

        public final void test() {
            MethodInterceptor var10000 = this.CGLIB$CALLBACK_0;
            if (var10000 == null) {
                CGLIB$BIND_CALLBACKS(this);
                var10000 = this.CGLIB$CALLBACK_0;
            }
    
            if (var10000 != null) {
                var10000.intercept(this, CGLIB$test$0$Method, CGLIB$emptyArgs, CGLIB$test$0$Proxy);
            } else {
                super.test();
            }
        }
    
    

    可以看出,如果该对象没有被其他MethodInterceptor拦截,会直接调用父类的方法。此处也是一样,你已经把断点打在方法体内部了,this当然是实际对象,如果你需要获取代理对象,可通过AopContext.currentProxy()来获取。

        public Object transaction() {
            TestService service = (TestService) AopContext.currentProxy();
            demo1();
            return null;
        }
    

    类似与这种,注意类型转化。注意在启动类注解@EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true)。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 3月5日
  • 已采纳回答 2月26日
  • 创建了问题 2月25日

悬赏问题

  • ¥15 请问为什么我配置IPsec后PC1 ping不通 PC2,抓包出来数据包也并没有被加密
  • ¥200 求博主教我搞定neo4j简易问答系统,有偿
  • ¥15 nginx的使用与作用
  • ¥100 关于#VijeoCitect#的问题,如何解决?(标签-ar|关键词-数据类型)
  • ¥15 一个矿井排水监控系统的plc梯形图,求各程序段都是什么意思
  • ¥50 安卓10如何在没有root权限的情况下设置开机自动启动指定app?
  • ¥15 ats2837 spi2从机的代码
  • ¥200 wsl2 vllm qwen1.5部署问题
  • ¥100 有偿求数字经济对经贸的影响机制的一个数学模型,弄不出来已经快要碎掉了
  • ¥15 数学建模数学建模需要