解决Spring的@Transactional注解在类内部调用不生效

  1. 问题描述:在类内部调用方法时,被调用者的注解不生效?
    如下面例子,针对@Transactional注解, 如果在一个类A内部有a()调用了b(),在b()上加了注解,这时候注解是不生效的
类A{
  方法a(){方法b();}
  @Transactional
  方法b(){}
 }
  1. 为什么内部调用时,注解不生效?
    Spring的面向切面编程AOP是基于动态代理实现的,只有在类的方法被类外部调用时才会触发代理捕获,进行相应的操作。此时被类外部调用的方法是a()AOP匹配到的方法a()没有注解,不会进行捕获。
  1. 如何解决?
    有三种方法:
  • 如果a()方法本身没有针对数据库的操作,则可以在a()上加注解,且不在b()上加注解。(如果两个都加也不生效,原因待定)
  • 在不影响代码逻辑的情况下,可以把a()方法移到类A外部,使得方法b()能够被类外调到。
  • 自己拿到aop代理类,即在a()中通过 AopContext.currentProxy()获取到当前代理类,然后用代理类直接调用b(),即由a(){b();}改成 a(){(AopContext.currentProxy()).b();}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容