SpringMVC 請求處理流程
一,如何進行初始化,初始化時做了什么,Filter和Servlet什么時候注入的?
1,springboot啟動時onRefresh中會呼叫,ServletWebServerApplicationContext.createWebServer創建Tomcat
2,啟動容器時觸發TomcatStarter(實作了ServletContainerInitializer)onStartup方法初始化ServletContextInitializer介面的onStartup方法,第一步初始化內部ServletContextInitializer

第二步,通過ServletWebServerApplicationContext::selfInitialize(即ServletContextInitializer onStartup函式方法)找出FilterRegisterBean和ServletRegisterBean并完成初始化(即ServletContextInitializer onStartup函式方法),初始化FilterRegisterBean和ServletRegisterBean的時候springboot會呼叫tomcat相關包初始化到tomcat容器里(DIspatcherServlet就是從這里初始化進去的,DispatcherServlet的ServletRegisterBean宣告在WebMVCAutoConfiguration里)
3,SpringBoot實體化bean后,AbstractHandlerMethodMapping通過InitializingBean的afterPropertiesSet進行RequestMapping檢索供請求到達DispatcherServlet doDispatch方法是進行匹配對應HandlerMapping進行反射呼叫
二,一個請求如何從Tomcat到DispatcherServlet?
一個請求首先通過Socket接收到,進入Tomcat包中的Http11Processor service方法進行處理呼叫getAdapter().service(request,response),方法內呼叫postParseRequest(req,request,res,response)->connector.getService().getMapper().map(…,…,…)->internalMap(…)->internalMapWrapper(…)通過不同的Rule規則匹配請求的wrapper,然后通過wrapper進行呼叫創建filterchain最終呼叫到DispatcherServlet的doDispatch()方法,
三,一個請求如何從DispatcherServlet再到對應的RequestMapping做處理的?
首先找到匹配的handlerMapping

,在匹配能處理此handlermapping的handlerAdapter

,handlerAdapter通過HandlerMethodArgumentResolverComposite getArgumentResolver()找出支持處理的resolver,如果是@RequestBody則使用RequestResponseBodyMethodProcessor進行處理,呼叫HttpMessageConverter canread和read進行訊息轉換,通過反射機制呼叫Controller中對應的方法,最后通過HandlerMethodReturnValueHandlerComposite selectHandler()找出支持處理的HandlerMethodReturnValueHandler,如果是@ResponseBody則使用RequestResponseBodyMethodProcessor進行處理,呼叫HttpMessageConverter canwrite和write進行訊息轉換回應,
四,HandlerMapping和HandlerAdapter是如何加載的?
Tomcat包中的 StandardWrapperValve wrapper.allocate()中,DispatcherServlet init()的時候,優先獲取WebMVCAutoConfiguration中配置,如果沒有則獲取webmvc中默認的策略
五,如何自定義mvc配置?
繼承WebMvcConfigure進行配置,在DelegatingWebMvcConfiguration中會對自定義的WebMvcConfigure添加到WebMvcConfigureComposite進行多配置合并處理,通過WebMvcConfigurationSupport進行多配置獲取,
文章內容可能不完全正確,如有錯誤請指出,謝謝
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/261425.html
標籤:其他
