- 问题描述:在类内部调用方法时,被调用者的注解不生效?
如下面例子,针对@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();}