SpringMVC(關於HandlerMapping執行流程原理分析)


請求過來先碰見中央調度器(前端調度器)

//Determine handler for the current request; 對當前請求決定交給哪個handler, 當前請求地址過來

處理器執行鏈處理請求,接着我們去找getHandler的實現

hm是HandlerMapping對象,下圖選定位置調用HandlerMapping的getHandler()方法通過請求找到Handler,但是返回值為HandlerExecutionChain(執行鏈)

這個servlet所支持的處理器映射器的集合,這里有N個處理器映射器。hm就是指HandlerMapping ,下面的if中的代碼是指記錄日志,日志跟蹤。HandlerMapping處理器映射器中有N個攔截器,處理客服端請求的處理器只有一個,就是handler處理器。

getHandler我們跟進去,

看過來的handler是不是執行鏈,要是就把handler強轉成執行鏈,如果不是我new出一個執行鏈並且把handler給執行鏈。

HandlerInterceptor是處理器的攔截器。而且不是一個是多個攔截器(this.adaptedInterceptors),然后做了一個操作。如果當期攔截器,是映射用的攔截器,就把他給強轉成處理器映射器。

然后做了一個匹配,和查找的路徑做匹配。然后加到了執行鏈攔截器中。那么如果不是就直接用一個的參數來添加。所有可以看出HandlerExecutionChain中只包含一個handler。包含N個攔截器。在把這個對象返回給了中央調度器。

 HandlerMapping總結:

DispatcherServlet

--->doDispatcher()

---->getHandler(request):

---->HandlerExecutionChain

------> hm.getHandler(request)-----》方法體中

----->ExecutionChain executionChain = getHandlerExecutionChain(handler, request);

----->new HandlerExecutionChain(handler)

----->chain.addInterceptor(interceptor);

HandlerMapping:處理器映射器
作用:根據【請求】找到【處理器Handler】,但並不是簡單的返回處理器,而是
將處理器和攔截器封裝,形成一個處理器執行鏈(HandlerExecuteChain)。

4.DispatcherServlet 拿着執行鏈去尋找對應的處理器適配器(HandlerAdapter)
為什么要引入適配器?
因為處理器(Handler)有很多種,DispatcherServlet沒辦法統一管理,所以出現了適配器。

讓適配器統一處理Handler,而DispatcherServlet統一處理適配器。

根據請求去找對應的handler

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM