Spring AOP其实是通过动态代理实现的,那么今天要聊的这个问题就是设想什么情况不能使用动态代理,这个问题其实跟Spring事务失效的场景差不多
内部类调用
首先就是类内部的调用,比如一些私有方法调用,内部类调用,以及同一个类中方法的自调用等。
例如以下方法都是因为在对象内部直接调用其他方法,就会用原始对象直接调用了,不会调用到代理对象,所以代理会失效。
//1
public class MyService {
public void doSomething() {
doInternal(); // 自调用方法
}
public void doInternal() {
System.out.println("方法一");
}
}
//2
public class MyService {
public void doSomething() {
doInternal(); // 自调用私有方法
}
private void doInternal() {
System.out.println("方法二");
}
}
//3
public class OuterClass {
private class InnerClass {
public void doSomething() {
System.out.println("方法三");
}
}
public void invokeInnerClassMethod() {
InnerClass innerClass = new InnerClass();
innerClass.doSomething(); // 调用内部类方法
}
}
还有一种方法,也无法被代理,那就是final方法,由于AOP是通过创建代理对象来实现的,而无法对final方法进行子类化和覆盖,所以无法拦截这些方法。
总结
使AOP失效的场景一共有五个
1、私有方法调用
2、静态方法调用
3、final方法调用
4、类内部自调用
5、内部类方法调用