【應用】
以下是一段代碼,Spring MVC 的 diapatcherServlet 的 doDispatch 方法中,獲取與請求匹配的處理器(HandlerExecutionChain)
getHandler 方法的處理使用到了責任鏈模式,handlerMappings 是之前 Spring 容器初始化好的,通過遍歷 handlerMappings 查找與 request 匹配的 Handler, 這里返回 HandlerExecutionChain 對象。這個 HandlerExecutionChain 對象到后面執行的時候再分析為什么返回的是這樣一個對象。
【簡介】
先來看一個圖:這里表達是一個休假申請由於實際內容的不同,按照優先級別尋找可以審批該申請的角色的一個過程。
【百度百科】責任鏈模式是一種設計模式。在責任鏈模式里,很多對象由每一個對象對其下家的引用而連接起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。發出這個請求的客戶端並不知道鏈上的哪一個對象最終處理這個請求,這使得系統可以在不影響客戶端的情況下動態地重新組織和分配責任。
責任鏈模式在面向對象程式設計里是一種軟件設計模式,它包含了一些命令對象和一系列的處理對象。每一個處理對象決定它能處理哪些命令對象,它也知道如何將它不能處理的命令對象傳遞給該鏈中的下一個處理對象。該模式還描述了往該處理鏈的末尾添加新的處理對象的方法。
責任鏈模式實現了請求者和處理者的解耦。
【Spring MVC 中的 Handler 實現】
接口 HandlerMapping 是上圖 Handler 的代碼實現,提供了 getHandler 方法用於判斷 Hanlder 的具體實現類 ConcreteHanlder 是否可以處理該請求。如果可以處理,則返回一個 HandlerExecution 對象,里面包含一個請求處理器(a handler)和 任意個請求攔截器(any interceptors);如果不能處理,則返回 null 值。
那么,Spring MVC 如何將所有的 ConcreteHanlder 形成一條鏈,讓某一個 ConcreteHanlder 在處理不了當前請求時可以獲取下一個 ConcreteHanlder 呢 ?