多个拦截器执行顺序原理(源码分析)

我们配置多个拦截器,看看输出结果:
在这里插入图片描述
开始执行
在这里插入图片描述

查看结果
在这里插入图片描述
我们可以看出多个拦截器的执行顺序为

  • preHandle:从第一个往后执行
  • postHandle:从后往前执行
  • afterCompletion:从后往前执行

这里的先后为配置拦截器的顺序:

 <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="Interceptors.FirstInterceptor"/><!-- 第一个拦截器 -->
        </mvc:interceptor>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="Interceptors.SecondInterceptor"/><!-- 第二个拦截器 -->
        </mvc:interceptor>
        <!--<ref bean="firstInterceptor"></ref>-->
    </mvc:interceptors>

为什么会是这种顺序呢,我们一步一步通过源码流程来看:

当我们preHandle()返回值全部为true时

在这里插入图片描述
经过上述分析,我们可以清晰的了解到为什么会有那种顺序的执行方式了
那要是拦截器链的所有preHandle中有的返回false呢?

preHandle()返回false

还是用我们上面的案例,设置两个preHandle返回值都为false
看运行结果:

First preHandle

下面来看分析:
在这里插入图片描述
通过分析和结果证明了我们的推理过程

还是用我们上面的案例,设置第一个为true,第二个为false
看运行结果:

First preHandle
Second preHandle
First afterHandle

我们通过上面的分析过程再来分析:
在进入applyHandle方法后,通过if条件判断,第一个preHandle返回true,执行一次,输出First preHandle,InterceptorIndex计数一次,第二次判断的时候执行了第二个拦截器的preHandle,输出在second preHandle,该拦截器返回false,然后执行triggerAfterCompletion(),根据计数InterceptorIndex执行对应拦截器的afterCompletion方法,输出First AfterHandle

发布了37 篇原创文章 · 获赞 11 · 访问量 3890

猜你喜欢

转载自blog.csdn.net/Alphr/article/details/104723242