上篇文章主要介绍了methodInterceptor拦截器吧增强组件返回的过程:
获取拦截器链MethodInterceptor---Spring源码从入门到精通(二十二)
这篇文章主要介绍拦截器链如何触发:
一、拦截器链的触发过程
1、首先第一个判断是,返回的拦截器集合为空,则直接执行目标方法。
(后面的proceed方法里,拦截器的索引等于拦截去数组-1,也就是执行到了最后一个拦截器,也是直接执行目标方法)
若不为空,CglibMethodInvocation调用proceed()。
点进proceed父类的方法,从源码可以看到currentInterceptorIndex默认是-1,记录当前拦截器的索引。并且每次执行proceed方法,索引都会自增一次。
2、前面的四个拦截器,分别为
ExposeInvocationInterceptor,AspectAfterThrowingAdvice,AfterReturningAdviceInterceptor,AspectAfterAdvice
每次都会调用invoke方法,invoke方法里面又会调用proceed方法。直到索引到最后一个拦截器,跳出循环。
下面已ExposeInvovationInterceptor方法为例
3、最后一个拦截器MethodBeforeAdviceInterceptor,先调用前置通知,在调用proceed()。开始return跳出循环。
4、renturn跳出循环调用invokeJoinpoint方法。
总结,链式获取每一个拦截器,拦截器执行invoke方法,每一个拦截器等下一个拦截器返回以后再来执行,拦截器链的机制,保证每个拦截器的执行顺序。