AOP 的实现原理是,通过动态代理生成一个新的代理类(因为是运行时生成,所以称为动态),再通过代理类来调用目标方法,并在调用前或调用后添加操作。
JDK 动态代理需要通过接口类;CGlib动态代理不需要目标实现接口;
动态代理的实现类似于:
@Service
public class A {
@Transactional
public void a(){
b();
c();
}
public void b(){}
public void c(){}
}
public class Proxy$xxxx {
@Autowired
private A a;
public void a(){
// @Around
// @Before
a.a();
// @Around
// @After(final增强)
// @AfterReturning 方法正常退出时执行
// @AfterThrowing 异常抛出增强,执行但不catch
}
}
由此可以看出实际调用是通过this来调用, 所以调用本类切面方法, 被调用的方法的切面并不会生效.
不用this引用, 而使用代理类来执行目标方法就行了:
@Service
public class A{
//拿到代理类
@Autowired
private A self;
public void a(){
//通过代理类来调用方法
self.b();
self.c();
}
}
另外, Spring官方提倡的是使用一个新的中间类来解决此类问题:
@Service
public class Mid {
@Autowired
private A a;
public void a(){
//通过代理类来调用方法
a.b();
a.c();
}
}



