?【Spring專題】「原理系列」SpringMVC的執行工作原理(補充修訂)

浩宇天尚發表於2021-12-25

承接相關之前的SpringMVC的框架技術的流程分析

初始化流程(initStrategies)

執行流程

尋找相關HandlerMapping

請求到DispatcherServlet類進行執行相關的HandlerMapping集合,找到對應型別的HandlerMapping物件的實現類,如果是一般的採用註解(@RequestMapping)注入的實現類(RequestMappingHandlerMapping)類,

HandlerMapping實現類之RequestMappingHandlerMapping物件

找出Spring容器中被@Controller/@RestController註解修飾的bean以及被@RequestMapping註解修飾的類和方法。

HandlerMapping屬性的HandlerMethod物件

HandlerMethod是Method以及Parameter的helper class。在HandlerMapping中被構造,
並在HandlerAdapter中被使用。

HandlerExecutionChain物件

當獲取到對應的HandlerMapping物件的實現類後,接下來返回到DispatcherServlet類物件,需要構建或者獲取相關的HandlerExecutionChain物件,內部包含了很多額外元件,例如:interceptor攔截器。

HandlerAdapter物件

根據HandlerExecutionChain中的Handler,在對應的HandlerAdapter集合找到支援此Handler的HandlerAdapter,呼叫相關的HandlerMethod物件方法,使用HandlerAdapter得到ModelAndView物件返回到DispatcherServlet。

RequestMappingHandlerAdapter

找到的對應的RequestMapping的HandlerAdapter物件的實現類RequestMappingHandlerAdapter物件操作處理。

HandlerInterceptor攔截器
  • 前置攔截器:HandlerInterceptor-preHandle
  • 後置攔截器:HandlerInterceptor-postHandle
HandlerExceptionResolver異常處理

上面的操作處理方式可能會發生異常,使用HandlerExceptionResolver策略解決。

RequestMappingHandlerAdapter的處理操作

  • HandlerMethodArgumentResolverComposite:該物件處理和包含了內部多個HandlerMethodArgumentResolver集合。
    • HandlerMethodArgumentResolver:解析相關的方法入口引數的解析機制!
  • HandlerMethodReturnValueHandlerComposite:該物件處理和包含了內部多個的HandlerMethodReturnValueHandler集合。
    • HandlerMethodReturnValueHandler:該物件處理和操作方法的返回值

HandlerMethodArgumentResolver引數入口的解析器

RequestParamMethodArgumentResolver

處理@RequestParam註解修飾的引數:HandlerMethodArgumentResolver的實現類之一:RequestParamMethodArgumentResolver

RequestResponseBodyMethodProcessor

處理@RequestBody註解修飾的引數:HandlerMethodArgumentResolver的實現類

HandlerMethodReturnValueHandler引數返回操作解析器

RequestResponseBodyMethodProcessor

處理@ResponseBody註解修飾的返回值:HandlerMethodReturnValueHandler的實現類

ModelAndViewMethodReturnValueHandler

處理返回值型別為ModelAndView物件返回值:HandlerMethodReturnValueHandler的實現類

ViewResolver檢視解析器

將ModelAndView的物件資料與資料頁面模板進行解析處理操作ViewResolver物件,生成相關的View物件。並且返回相關的response:freemarker, jsp. json, xml等。

HandlerInterceptor的收官處理

最終完成攔截器:afterCompletion方法操作。

相關文章