淺談Spring中HandlerMapping的使用
HandlerMapping
- Spingmvc中的HandlerMapping負責解析請求URL,對應到Handler進行處理(這里的Handler一般為Controller里的一個方法method,也可以為servlet或者Controller等)
來看一個http請求的入口DispatcherServlet:



- DispatcherServlet繼承FrameworkServlet,F(xiàn)rameworkServlet繼承HttpServletBean,HttpServletBean繼承HttpServlet。
可以看出,springmvc的DispatcherServlet是在Servelt的基礎上做了擴展處理。

doService方法為servlet處理請求的入口,DispatcherServlet中做了方法覆蓋,doService方法中的doDispatch(request,response)方法,是springmvc處理整個請求流程的關鍵。
- mappedHandler =getHandler(processedRequest);
- 這行代碼實現(xiàn)了為請求尋找處理handler,返回的是HandlerExecutionChain;
- HandlerAdapter ha =getHandlerAdapter(mappedHandler.getHandler());
- 找到處理handler后,再去找匹配的HandlerAdapter,HandlerAdapter將完成后續(xù)處理。

繼續(xù)看是如何找到請求對應的處理handler的:

可以看出是從類變量this.handlerMappings中循環(huán)獲取,當找到與之匹配的HandlerMapping時,返回類型為HandlerExecutionChain的handler。
這里this.handlerMappings中的值是從哪獲取的呢?DispatcherServlet初始化的時候會給this.handlerMappings賦值:


- 從這里可以看出,在servlet初始化的時候,會對springmvc的HandlerMappings、HandlerAdapters等做初始化。
- 這里三個步驟,先對springmvc.xml里配置的HandlerMapping進行初始化、實例化,再對this.handlerMappings賦值,最后對this.handlerMappings進行排序。
- 這里的排序就是對HandlerMapping的order屬性進行排序,這樣,order屬性值小的,就可以先對請求進行匹配。
從tomcat啟動日志里可以看到HandlerMapping的初始化:

這里涉及到兩個HandlerMapping:
- 第一個是BeanNameUrlHandlerMapping,初始化時會將urlpath做映射存儲;
- 第二個是RequestMappingHandlerMapping,初始化時會將Controller中配置@RequestMapping注解的方法做映射存儲。
HandlerMapping初始化時,會將映射與handler存儲到map里;處理請求時,從map里取出對應的處理handler。
這就是HandlerMapping在springmvc里的大致處理流程。
到此這篇關于淺談Spring中HandlerMapping的使用的文章就介紹到這了,更多相關HandlerMapping的使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
如何使用Spring AOP的通知類型及創(chuàng)建通知
這篇文章主要給大家介紹了關于如何使用Spring AOP的通知類型及創(chuàng)建通知的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Spring AOP具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2019-12-12

