Spring基础系列--AOP织入逻辑跟踪

 原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9619910.html

  其实在之前的源码解读里面,关于织入的部分并没有说清楚,那些前置、后置、环绕、异常等通知是如何围绕在目标方法周围执行的呢?

  这里面最重要的就是递归,Spring在实现这块逻辑的时候使用的大量的递归调用,完美的实现的织入的逻辑。

  我们不凡就以Spring基础系列--AOP实践中的例子来进行一番逻辑追踪,来一探究竟。

  我们就从测试类开始:

Spring基础系列--AOP织入逻辑跟踪

  首先我们通过CglibAopProxy类的intercept方法构建一个方法调用,并执行其proceed方法:

Spring基础系列--AOP织入逻辑跟踪

  然后进入ReflectiveMethodInvocation类的proceed()方法,由于currentInterceptorIndex下标从-1开始,在进行++自增操作之后变成0,获取interceptorsAndDynamicMethodMatchers中的第一个拦截器。

Spring基础系列--AOP织入逻辑跟踪

  我们看下interceptorsAndDynamicMethodMatchers中的内容:

 

Spring基础系列--AOP织入逻辑跟踪

  第一个是ExposeInvocationInterceptor,这个正是之前在Spring基础系列-AOP源码分析中源码11里提到的,获取通知链的时候会将其放到通知链首位,用于暴露方法调用到ThreadLocal中。

  由于其为一个简单的拦截器,上面的判断是不成立的,所以直接执行最后一行:

Spring基础系列--AOP织入逻辑跟踪

  然后进入到ExposeInvocationInterceptor方法的invoke方法中

Spring基础系列--AOP织入逻辑跟踪

  在这个方法中我们可以看到,90行处,将方法调用mi放到了invocation中。那invocation是什么呢?如下

1 private static final ThreadLocal<MethodInvocation> invocation = new NamedThreadLocal<>("Current AOP method invocation");

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzjdfw.html