多個攔截器執行順序原理(源碼分析)

我們配置多個攔截器,看看輸出結果:
在這裏插入圖片描述
開始執行
在這裏插入圖片描述

查看結果
在這裏插入圖片描述
我們可以看出多個攔截器的執行順序爲

  • 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章