暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

后端从入门到精通 2021-08-20
255

上篇文章主要介绍了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方法,每一个拦截器等下一个拦截器返回以后再来执行,拦截器链的机制,保证每个拦截器的执行顺序。

文章转载自后端从入门到精通,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论