对【com.example.demo.TestAspect#aopTest】连接点增加了五个通知
在调用【com.example.demo.A#testAop()】(用户自定义)方法时,Cglib拦截器对其进行了拦截
可以看到执行顺序分别是环绕前置,前置,环绕后置,后置,返回后置
有异常的情况下执行顺序分别是环绕前置,前置,环绕后置,后置,异常后置
在拦截时生成了【org.springframework.aop.framework.CglibAopProxy.CglibMethodInvocation】对象,这是贯穿整条拦截器链的重要类,该类继承了【org.aopalliance.intercept.Joinpoint】一个重要的方法【org.aopalliance.intercept.Joinpoint#proceed】
在执行【org.aopalliance.intercept.Joinpoint#proceed】方法时(实际是重写方法【org.springframework.aop.framework.ReflectiveMethodInvocation#proceed】),当前对象中的拦截器链【org.springframework.aop.framework.ReflectiveMethodInvocation#interceptorsAndDynamicMethodMatchers】有刚才在对【com.example.demo.TestAspect#aopTest】连接点增加的五个通知,注意下这个链的顺序,随后调用了【org.aopalliance.intercept.MethodInterceptor#invoke】
SpringAOP拦截器链的原理类似栈的方式,先进后出,最开始执行的是【org.springframework.aop.aspectj.AspectJAfterThrowingAdvice】,会看到【org.aopalliance.intercept.MethodInterceptor#invoke】的参数是【org.aopalliance.intercept.MethodInvocation】,方法内结果执行的还是【org.aopalliance.intercept.Joinpoint#proceed】
所以看到拦截器链的核心原理就是【org.aopalliance.intercept.Joinpoint#proceed】和【org.aopalliance.intercept.MethodInterceptor#invoke】两个方法,所以在调用【com.example.demo.A#testAop】方法时的链路是这样的,都是通过【org.aopalliance.intercept.Joinpoint#proceed】来贯穿整个链路