目录:
- Spring IOC中的对象
- AOP拦截方法什么时候会失效
参考:
Spring IOC中的对象
Spring IOC容器启动后,在默认单例模式下启动,会在容器里面报错对应Bean的一个实例,后续调用Bean的时候,都会获取这个原生实例。
但有两种情况会使用代理对象
- AOP切面会作用到的类。AOP的原理就是使用动态代理,生成一个代理类,对原有方法进行增强
- 使用
@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;
}
}