Spring的AOP在什么场景下会失效?
SpringAOP是通过动态代理实现的,所以想要AOP生效就是需要动态代理生效,并且可以提前调用到代理对象的方法。
什么情况下会不走动态代理呢?
首先就是类内部的调用,比如一些私有方法的调用,内部类调用,以及同一个方法的自调用等。如:
//1
public class MyService {public void doSomething() {doInternal(); // 自调用方法}public void doInternal() {System.out.println("Doing internal work...");}
}//2
public class MyService {public void doSomething() {doInternal(); // 自调用私有方法}private void doInternal() {System.out.println("Doing internal work...");}
}//3
public class OuterClass {private class InnerClass {public void doSomething() {System.out.println("Doing something in inner class...");}}public void invokeInnerClassMethod() {InnerClass innerClass = new InnerClass();innerClass.doSomething(); // 调用内部类方法}
}
以上都是对象内部调用其他方法,就会使用原始对象调用了,不会调用到代理对象,所以代理对象会失效。
还有一种情况虽然不是对象的自调用,但是也会让动态代理失效,就是static方法,因为static方法不属于对象,属于类的。所以不能被AOP的。
还有一种情况就是被final修饰的方法,也会使AOP失效,由于AOP是通过创建代理对象来实现的,而无法对final方法进行子类化和覆盖,所以无法拦截这些方法。
所以,那么总结一下就是以下几种情况,会导致代理失效,AOP不起作用:
1、私有方法调用
2、静态方法调用
3、final方法调用
4、类内部自调用
5、内部类方法调用