Spring開發中經常遇到的HandlerMapping與HandlerAdapter

一本書讓你熟練使用Spring和SpringMVC



HandlerMapping:

Spring MVC使用HandlerMapping來找到並保存url請求和處理函數間的mapping關係。


以DefaultAnnotationHandlerMapping為例來具體看HandlerMapping的作用:

  1. DefaultAnnotationHandlerMapping將掃描當前所有已經註冊的Spring Beans中的@RequestMapping標註以找出url和handler method處理函數的關係並予以關聯。

HandlerAdapter:

Spring MVC通過HandlerAdapter來實際調用處理函數。


以AnnotationMethodHandlerAdapter為例:

  1. DispatcherServlet中根據handler mapping找到對應的handler method後,首先檢查當前工程中註冊的所有可用的handlerAdapter,根據handlerAdapter中的supports方法找到可以使用的handlerAdapter。通過調用handlerAdapter中的handle方法來處理及準備handler method中的參數及annotation(這就是Spring MVC如何將request中的參數變成handle method中的輸入參數的地方),最終調用實際的handler method。

detectAllHandlerMappings:

缺省情況下Spring MVC將加載當前系統中所有實現了HandlerMapping接口的bean。


如果只期望Spring MVC加載指定的handler mapping時,可以修改web.xml中的DispatcherServlet的初始參數,將detectAllHandlerMappings的值設置為false。此時Spring MVC將查找名為“handlerMapping”的bean並作為當前系統中唯一的handlerMapping。


如果沒有定義handlerMapping的話,則Spring MVC將按照org.springframework.web.servlet.DispatcherServlet所在目錄下的DispatcherServlet.properties中所定義的org.springframework.web.servlet.HandlerMapping的內容來加載缺省的handlerMapping(用戶沒有自定義Strategies的情況下)。


Spring開發中經常遇到的HandlerMapping與HandlerAdapter

detectAllHandlerAdapters:

作用和detectAllHandlerMappings類似,只不過作用對象為handlerAdapter。亦可通過將detectAllHandlerAdapters的值設置為false 來強制系統只加載bean name為“handlerAdapter”的handlerAdapter。加載不到的情況下將按照DispatcherServlet.properties中所定義的org.springframework.web.servlet.HandlerAdapter的內容來加載缺省的handlerAdapter。

Spring開發中經常遇到的HandlerMapping與HandlerAdapter

EnableWebMvc

使用@EnableWebMvc(或者<annotation-driven>)可以為Spring註冊DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter。為了@Controller方法能夠正確地處理URL所映射的請求,必須要配置@EnableWebMvc或者<annotation-driven>。


分享到:


相關文章: