当前位置: 首页 > news >正文

解决Spring的代理失效问题

1.问题描述

在Spring中如果有如下代码,此时testB无论是异步还是事务都是不生效的。当然除了异步、事务还有很多别的注解,只要是Spring需要通过切面来处理的都会导致失效。

public void testA(){this.testB();
}@Async
@Transactional(rollbackFor = Exception.class)
public void testB() {
}

2.问题解决

  • 方案一:将testB写到别的类中,然后通过注入的方式使用testB
    比较简单,不进行举例了

  • 方案二:无需将testB异动,在他们的共同类中注入自己,然后用注入的对象调用,改写后如下
    这样也可以解决这个问题

    public Class A{@Resourceprivate Class A;~~~javapublic void testA(){A.testB();}@Async@Transactional(rollbackFor = Exception.class)public void testB() {}
    }
    
  • 方案三:使用Spring的AopContext.currentProxy()
    使用这个Api可以直接获取到当前的类的代理对象,这样就可以直接调用了,也可以解决这个问题,示例代码如下:

    public Class A{~~~javapublic void testA(){((A)AopContext.currentProxy()).testB();}@Async@Transactional(rollbackFor = Exception.class)public void testB() {}
    }
    

3.总结

使用Spring的代理功能时需要注意这个问题,各个注解的代理功能大多都有这个问题,推荐使用方案二和方案三来解决这个问题。


http://www.mrgr.cn/news/13726.html

相关文章:

  • 零基础学习Redis(8) -- list类型命令使用
  • ubuntu jammy vagrant 国内源
  • [设计模式之抽象工厂模式—— 家具工厂]
  • 基于深度学习的游客满意度分析与评论分析【情感分析、主题分析】
  • Java设计模式之建造者模式详细讲解和案例示范
  • HTML沙漏爱心
  • SQL进阶技巧:如何查询最近一笔有效订单? | 近距离有效匹配问题
  • 云计算概述
  • Spring MVC常用注解及用法
  • 无人机挂载迫击炮吊舱设计技术详解
  • Selenium(HTML基础)
  • Vue 0_1项目实战
  • React -TS学习—— useRef
  • Swift concurrency 4 — Task和.task的理解与使用
  • Go 服务调试精解
  • ZooKeeper体系架构、安装、HA
  • [MySql]保姆级上手教程
  • 软考:软件设计师 — 17.程序设计语言与语言处理程序基础
  • Datawhale X 李宏毅苹果书 AI夏令营_深度学习基础学习心得Task2
  • SSM复习