首先我们得明白动态代理,其实就是创建了一个proxy对象,实现了目标方法的接口或者修改字节码什么的,使得这个对象调用起来和目标对象一样一样的。
然后在这个proxy中有和目标对象一样的同名方法,我们在这个方法前后加上增强,也就是前置通知和后置通知,就实现了代理。
AOP会将这些增强代码包装成拦截器,组合成拦截器链,通过递归的方式巧妙实现Before -> 目标方法 -> After形式的代码织入。
在源码中,做这件事的代码叫做
new CglibMethodInvocation(…).proceed()
源码中,会首先进行判断,所有拦截器执行完了,才会调用目标方法,否则就一直递归调用拦截器。
那么是怎么实现包夹顺序的呢?原因在Before和After拦截器上。
AOP中除了Before拦截器是先执行Before再执行proceed,其他拦截器都是先调用proceed再调用After通知,因此Before拦截器也是拦截器链的最后一环。
再想想,After拦截器在前面,都是调用proceed方法先递归到下一层拦截器,到了最后的Before拦截器,先调用了Before通知,然后调用下一层拦截器发现已经调用完所有拦截器了,所以直接执行目标方法,然后弹回倒数第二个拦截器……然后执行After通知,实现了包夹的顺序。