HandlerAdapter,處理器擴充卡,Spring MVC通過HandlerAdapter來實際調用處理方法。
當HandlerMapping擷取了處理器,DispatcherServlet會将得到的Handler告知HandlerAdapter,HandlerAdapter再根據請求去定位請求的具體處理方法是哪一個。
MVC架構SPI,核心MVC工作流程,允許參數。
接口,必須為每個處理程式類型來處理的請求來實作。 該接口用于允許DispatcherServlet是無限擴充。 在DispatcherServlet通過這個接口通路所有已安裝的處理程式,這意味着它不包含特定的代碼處理各種事務的類型。
需要注意的是處理程式的類型可以是的Object 。 這是為了讓其他架構中的處理程式使用此架構結合,而不定制編碼,以及允許那些不服從任何特定的Java接口注解驅動的處理程式對象。
此接口不用于應用程式開發。 它是提供給誰想要開發自己的Web工作流程處理程式。
注意: HandlerAdapter實作者可以實作org.springframework.core.Ordered接口能夠指定用于通過得到施加的排列順序(并且是以優先級) DispatcherServlet 。 無序情況下得到的待遇是最低的優先級。
流程
1.DispatcherServlte會根據配置檔案資訊注冊HandlerAdapter,如果在配置檔案中沒有配置,那麼 DispatcherServlte會擷取HandlerAdapter的預設配置,如果是讀取預設配置的話,DispatcherServlte會讀取 DispatcherServlte.properties檔案,該檔案中配置了三種 HandlerAdapter:HttpRequestHandlerAdapter,SimpleControllerHandlerAdapter和 AnnotationMethodHandlerAdapter。DispatcherServlte會将這三個HandlerAdapter對象存儲到 它的handlerAdapters這個集合屬性中,這樣就完成了HandlerAdapter的注冊。
2.DispatcherServlte會根據handlerMapping傳過來的controller與已經注冊好了的HandlerAdapter 一一比對,看哪一種HandlerAdapter是支援該controller類型的,如果找到了其中一種HandlerAdapter是支援傳過來的 controller類型,那麼該HandlerAdapter會調用自己的handle方法,handle方法運用Java的 反射機制執行controller的具體方法來獲得ModelAndView,例如SimpleControllerHandlerAdapter是支援 實作了controller接口的控制器,如果自己寫的控制器實作了controller接口,那麼 SimpleControllerHandlerAdapter就會去執行自己寫控制器中的具體方法來完成請求。
作用
- HandlerAdapter定義了如何處理請求的政策,通過請求url、請求Method和處理器的requestMapping定義,最終确定使用處理類的哪個方法來處理請求,并檢查處理類相應處理方法的參數以及相關的Annotation配置,确定如何轉換需要的參數傳入調用方法,并最終調用傳回ModelAndView。
DispatcherServlet中根據HandlerMapping找到對應的handler method後,首先檢查目前工程中注冊的所有可用的handlerAdapter,根據handlerAdapter中的supports方法找到可以使用的handlerAdapter。
通過調用handlerAdapter中的handler方法來處理及準備handler method的參數及annotation(這就是spring mvc如何将request中的參數變成handle method中的輸入參數的地方),最終調用實際的handler method。
總結
handlerAdapter這個類的作用就是接過handlermapping解析請求得到的handler對象。再更精确的定位到能夠執行請求的方法。