javascript
Spring MVC 执行过程原理(请求映射原理、参数处理原理、返回值处理器)
Spring MVC 執行過程分析
文章目錄
- Spring MVC 執行過程分析
- 請求映射原理
- 適配器Adapter
- 執行目標方法
- 參數處理器解析器HandlerMethodArgumentResolver
- @RequestBody測試
- @RequestParam測試
- RequestParamMethodArgumentResolver分析
- 執行目標方法體
- 返回值處理器解析器
- 目標方法執行完成
- 處理派發結果
請求映射原理
SpringMVC功能分析都從 org.springframework.web.servlet.DispatcherServlet-》doDispatch()方法
handlerMappings: 中保存了5個具體處理器映射器
請求進來getHandler()方法中,挨個嘗試遍歷所有的handlerMappings看是否有請求信息。如果有就找到這個請求對應的handler返回,如果沒有就是下一個 HandlerMapping
這handler就是Controller控制器中對應的具體方法。
RequestMappingHandlerMapping:保存了所有@RequestMapping 和handler的映射規則,在容器啟動就已經初始化好了。這handler就是Controller控制器中對應的具體方法。
適配器Adapter
1、在請求映射中調用getHandler()方法找到能處理請求的Handler,找到了RequestMappingHandlerMapping處理,這Handler就是Controller控制器中對應的具體方法。
2、然后調用getHandlerAdapter()方法為當前handler找一個適配器 HandlerAdapter;找到了 (RequestMappingHandlerAdapter) 處理
3、適配器可以讓我們寫的控制器方法和DispatcherServlet一起協同工作
執行目標方法
1、適配器執行目標handle并確定方法參數的每一個值,返回ModelAndView對象
2、進入handle()方法,發行是HandlerAdapter接口,查看實現類
3、進到AbstractHandlerMethodAdapter抽象類中
4、查看具體實現類RequestMappingHandlerAdapter
5、在RequestMappingHandlerAdapter中執行目標方法,任何方法參數和返回值類型都將以某種方式進行處理。HandlerMethodArgumentResolver都無法識別的方法參數,如果是簡單類型,則將其解釋為請求參數,否則將其解釋為模型屬性。HandlerMethodReturnValueHandler都無法識別的返回值將被解釋為模型屬性。
6、跟進invokeHandlerMethod()方法,調用RequestMapping處理程序方法來準備ModelAndView
7、跟進invokeAndHandle()方法,調用該方法并通過其中一個配置的HandlerMethodReturnValueHandler或 HandlerMethodReturnValueHandlers處理返回值。
8、跟進invokeForRequest()方法中
9、調用Object[] args = this.getMethodArgumentValues(request, mavContainer, providedArgs);獲取方法的參數值,這里使用的策略模式,即被不同的注解修飾的參數,可以使用不同的參數解析器解析。其本質還是調用了servlet原生API獲取請求參數,只不過框架幫我們封裝了這個過程。
參數處理器解析器HandlerMethodArgumentResolver
確定將要執行的目標方法的每一個參數的值是什么;SpringMVC目標方法能寫多少種參數類型。取決于參數解析器,我們也可以自定義參數解析器。在解析參數時使用的策略模式,即被不同的注解修飾的參數,可以使用不同的參數解析器解析進行解析。
@RequestBody測試
使用了RequestResponseBodyMethodProcessor處理器解析器解析
@RequestParam測試
使用RequestParamMethodArgumentResolver解析器進行解析
由此證明了我們的結論,在進行參數綁定時,參數是否綁定成功,取決與我們是否有對該參數的處理器解析器。
RequestParamMethodArgumentResolver分析
跟進resolveArgument()方法,發行他是一個頂層接口HandlerMethodArgumentResolver,也就是所有參數處理器解析器的父類。
查看具體實現類RequestParamMethodArgumentResolver
總結: 確定將要執行的目標方法的每一個參數的值是什么;SpringMVC目標方法能寫多少種參數類型。取決于參數解析器,我們也可以自定義參數解析器。當前解析器是否支持解析這種參數,支持就調用 resolveArgument
執行目標方法體
繼續往下放行,會來到我們控制器方法中的斷點中
繼續F8往下走,當執行return "success"時往下F8會執行到doInvoke方法的return中返回
繼續往上層返回
繼續往上層返回
繼續往上層返回
返回值處理器解析器
1、返回值處理器判斷是否支持這種類型返回值 supportsReturnType
2、返回值處理器調用 handleReturnValue 進行處理
3、RequestResponseBodyMethodProcessor 可以處理返回值標了@ResponseBody 注解的。
-
利用 MessageConverters 進行處理將數據寫為json
1、內容協商(瀏覽器默認會以請求頭的方式告訴服務器他能接受什么樣的內容類型)
2、服務器最終根據自己自身的能力,決定服務器能生產出什么樣內容類型的數據,
3、SpringMVC會挨個遍歷所有容器底層的HttpMessageConverter,看誰能處理?
- 得到MappingJackson2HttpMessageConverter可以將對象寫為json
- 利用MappingJackson2HttpMessageConverter將對象轉為json再寫出去。
目標方法執行完成
將所有的數據都放在ModelAndViewContainer;包含要去的頁面地址View。還包含Model數據。
處理派發結果
處理程序選擇和處理程序調用的結果,這要么是一個ModelAndView,要么是一個要解析為ModelAndView的Exception。
總結
以上是生活随笔為你收集整理的Spring MVC 执行过程原理(请求映射原理、参数处理原理、返回值处理器)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分子生物学之蛋白质概述
- 下一篇: SpringBoot升级到2.0后默认时