Aop代理何时失效


目录:

  1. Spring IOC中的对象
  2. AOP拦截方法什么时候会失效

参考:

Spring IOC中的对象

Spring IOC容器启动后,在默认单例模式下启动,会在容器里面报错对应Bean的一个实例,后续调用Bean的时候,都会获取这个原生实例。

但有两种情况会使用代理对象

  1. AOP切面会作用到的类。AOP的原理就是使用动态代理,生成一个代理类,对原有方法进行增强
  2. 使用@Transactional注解的类。事务注解本就基于AOP

AOP拦截方法什么时候会失效

现象:在某个类上坐了切面,发现有时候并没有对各类advise生效。

原因:没有代理成功的方法并不是通过代理对象调用的,而是自身调用的,故被调用的方法没有被Aop代理,无法织入横切逻辑。

比如A.b()是我们想代理的方法,但在接口调用的时候,是通过a.()方法调用的b.()(a()方法中调用了自身的方法b())。此时我们以为b会被代理类代理,但实际上并没有,因为他是自身方法调用了并不是通过代理类A调用的

// 方法调用
class mainClass{
  
  private ClassTest classTest;
  private ClassTest classTest1;
  
  public void test(){
    // 拦截会失效,仍然返回2
    System.out.println(classTest.a());
    // 拦截生效,仍然返回1
    System.out.println(classTest.a());
  }
}

class ClassTest{
  
  public int a(){
    // ...
    return b.();
  }
  // 对注解所在方法拦截,返回1
  @TestAnnotaion
  public int b(){
    return 2;
  }
}

class ClassTest1{
  
  // 对注解所在方法拦截,返回1
  @TestAnnotaion
  public int a(){
    // ...
    return b.();
  }
  
  public int b(){
    return 2;
  }
}

文章作者: 小小千千
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小小千千 !
评论
  目录