vlambda博客
学习文章列表

连接器链调用---Spring源码从入门到精通(二十三)

上篇文章主要介绍了methodInterceptor拦截器吧增强组件返回的过程:



这篇文章主要介绍拦截器链如何触发:

一、拦截器链的触发过程

1、首先第一个判断是,返回的拦截器集合为空,则直接执行目标方法。

(后面的proceed方法里,拦截器的索引等于拦截去数组-1,也就是执行到了最后一个拦截器,也是直接执行目标方法)

若不为空,CglibMethodInvocation调用proceed()。

点进proceed父类的方法,从源码可以看到currentInterceptorIndex默认是-1,记录当前拦截器的索引。并且每次执行proceed方法,索引都会自增一次。

连接器链调用---Spring源码从入门到精通(二十三)

2、前面的四个拦截器,分别为

    ExposeInvocationInterceptor,AspectAfterThrowingAdvice,AfterReturningAdviceInterceptor,AspectAfterAdvice

   每次都会调用invoke方法,invoke方法里面又会调用proceed方法。直到索引到最后一个拦截器,跳出循环。

下面已ExposeInvovationInterceptor方法为例

3、最后一个拦截器MethodBeforeAdviceInterceptor,先调用前置通知,在调用proceed()。开始return跳出循环。

4、renturn跳出循环调用invokeJoinpoint方法。

   总结,链式获取每一个拦截器,拦截器执行invoke方法,每一个拦截器等下一个拦截器返回以后再来执行,拦截器链的机制,保证每个拦截器的执行顺序。