Spring AOP—类内部方法相互调用失效
- AOP原理
AOP的实现原理就是动态代理。Spring 的代理实现有两种:一是基于 JDK Dynamic Proxy 技术而实现的;二是基于 CGLIB 技术而实现的。如果目标对象实现了接口,在默认情况下Spring会采用JDK的动态代理实现AOP - 类内部方法调用不进入AOP
在一个类中,A方法调用B方法,是不会进入AOP的(比如B方法有@transactional),默认情况下A调用B是通过类的实际对象调用的B方法(通过this对象调用的),不是通过代理对象调用的,所以不会进入AOP。如果想调用的B的时候进入代理,可以通过开启@EnableAspectJAutoProxy(exposeProxy=true),然后TestService1 testService1 = (TestService1)AopContext.currentProxy(); 获取代理对象调用 testService1.b();或者把B方法单独抽离出去放在其它类中调用