原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9619910.html
其实在之前的源码解读里面,关于织入的部分并没有说清楚,那些前置、后置、环绕、异常等通知是如何围绕在目标方法周围执行的呢?
这里面最重要的就是递归,Spring在实现这块逻辑的时候使用的大量的递归调用,完美的实现的织入的逻辑。
我们不凡就以Spring基础系列--AOP实践中的例子来进行一番逻辑追踪,来一探究竟。
我们就从测试类开始:
首先我们通过CglibAopProxy类的intercept方法构建一个方法调用,并执行其proceed方法:
然后进入ReflectiveMethodInvocation类的proceed()方法,由于currentInterceptorIndex下标从-1开始,在进行++自增操作之后变成0,获取interceptorsAndDynamicMethodMatchers中的第一个拦截器。
我们看下interceptorsAndDynamicMethodMatchers中的内容:
第一个是ExposeInvocationInterceptor,这个正是之前在Spring基础系列-AOP源码分析中源码11里提到的,获取通知链的时候会将其放到通知链首位,用于暴露方法调用到ThreadLocal中。
由于其为一个简单的拦截器,上面的判断是不成立的,所以直接执行最后一行:
然后进入到ExposeInvocationInterceptor方法的invoke方法中
在这个方法中我们可以看到,90行处,将方法调用mi放到了invocation中。那invocation是什么呢?如下
1 private static final ThreadLocal<MethodInvocation> invocation = new NamedThreadLocal<>("Current AOP method invocation");