- 问题描述:在类内部调用方法时,被调用者的注解不生效?
如下面例子,针对@Transactional注解, 如果在一个类A内部有a()调用了b(),在b()上加了注解,这时候注解是不生效的
类A{
方法a(){方法b();}
@Transactional
方法b(){}
}
- 为什么内部调用时,注解不生效?
Spring的面向切面编程AOP是基于动态代理实现的,只有在类的方法被类外部调用时才会触发代理捕获,进行相应的操作。此时被类外部调用的方法是a(),AOP匹配到的方法a()没有注解,不会进行捕获。
- 如何解决?
有三种方法:
- 如果
a()方法本身没有针对数据库的操作,则可以在a()上加注解,且不在b()上加注解。(如果两个都加也不生效,原因待定) - 在不影响代码逻辑的情况下,可以把
a()方法移到类A外部,使得方法b()能够被类外调到。 - 自己拿到
aop代理类,即在a()中通过AopContext.currentProxy()获取到当前代理类,然后用代理类直接调用b(),即由a(){b();}改成a(){(AopContext.currentProxy()).b();}
