Spring MVC

九大基礎組件

  • MultipartResolver
  • LocaleResolver
  • ThemeResolver:站點主題樣式
  • HandlerMapping
  • HandlerAdapter
  • HandlerExceptionResolver
  • RequestToViewNameTranslator:可以在處理器返回的View爲空時使用它根據Request獲取ViewName
  • ViewResolver
  • FlashMapManager

MultipartResolver

處理文件上傳請求

  • CommonsMultipartResolver:使用Commons Fileupload 來處理multipart請求
  • StandardServletMultipartResolver:基於Servlet 3.0來處理multipart請求

HandlerMapping

尋找Handler

  • PropertySourcedRequestMappingHandlerMapping: springfox group /v2/api-doc
  • WebMvcEndpointHandlerMapping: @Endpoint @WebEndpoint @EndpointWebExtension
  • ControllerEndpointHandlerMapping: @ControllerEndpoint @RestControllerEndpoint
  • RequestMappingHandlerMapping: @RequestMapping @GetMapping, etc.
  • BeanNameUrlHandlerMapping: <bean id="/test.do" class="xxxController"/>xxxController implements Controller
  • RouterFunctionMapping: 自定義函數式端點路由映射
  • SimpleUrlHandlerMapping: swagger-ui.html, /webjar/**, 自定義的靜態資源處理器映射, etc.

HandlerInterceptor

請求前置,後置處理

  • MappedInterceptor: 自定義帶模式匹配的攔截器會被包裝其中,用以按請求路徑匹配要應用的攔截器
  • 自定義無模式匹配的攔截器
  • ConversionServiceExposingInterceptor: 暴露ConversionService,用於在請求處理過程中對請求參數或者返回值進行類型轉換 例如: String->LocalDate, etc.
  • ResourceUrlProviderExposingInterceptor: 暴露ResourceUrlProvider,用於靜態資源URL版本控制

Handler + HandlerInterceptors = HandlerExecutionChain

HandlerAdapter

調用請求處理器方法

  • RequestMappingHandlerAdapter: 處理HandlerMethod(核心) 基於@RequestMapping的對應方法處理
    該bean中初始化了ControllerAdvice ModelAttribue InitBinder RequestMapping HandlerMethodArgumentResolver HandlerMethodReturnValueHandler RequestBodyAdvice ResponseBodyAdvice 等類型beans
  • HandlerFunctionAdapter: 處理HandlerFunction
    基於函數式端點的方法處理
  • HttpRequestHandlerAdapter: 處理HttpRequestHandler實現
    業務自行處理請求,不需要通過ModelAndView 轉到視圖
  • SimpleControllerHandlerAdapter: 處理Controller實現
    基於標準控制器,返回ModelAndView
  • SimpleServletHandlerAdapter: 處理原始Servlet
    基於標準的servlet處理

ModelFactory

初始化/更新模型bean

  1. 合併已知的@SessionAttribute屬性列表
  2. 執行@ModelAttribute註釋的方法並添加
  3. 查找Handler方法中被@ModelAttribute註解標註又在@SessionAttributes中存在的參數,若模型視圖容器中不存在則添加

WebDataBinderFactory

初始化自定義的web數據綁定器,例如:‘2020-01-01’ String-> Date

HandlerMethodArgumentResolver

解析請求參數

  • RequestParamMethodArgumentResolver:把請求參數部分的值綁定到指定的方法參數上
  • RequestHeaderMethodArgumentResolver:把請求header部分的值綁定到指定的方法參數上
  • PathVariableMethodArgumentResolver:綁定請求路徑端點上的路徑變量
  • ModelAttributeMethodProcessor:模型屬性方法處理器,可綁定模型屬性參數
  • RequestResponseBodyMethodProcessor:解析用@RequestBody註釋的方法參數、@ResponseBody註釋的方法返回值, 讀取請求體時會先應用ResponseBodyAdvice切面
  • RequestPartMethodArgumentResolver:解析用@RequestPart註釋的方法參數
  • … 多達30多種
  • 自定義請求參數解析器

HandlerMethodReturnValueHandler

處理Handler方法返回值

  • ViewNameMethodReturnValueHandler: 處理字符串類型視圖名返回值
  • ModelAndViewMethodReturnValueHandler: 處理ModelAndView返回值
  • ResponseBodyEmitterReturnValueHandler:處理ResponseEntity/ResponseBodyEmitter返回值
  • RequestResponseBodyMethodProcessor: 處理@RequestBody註釋的方法參數、@ResponseBody註釋的方法返回值
  • … 多達10多種
  • 自定義方法返回值處理器

Processor後綴的,看起來像同時實現了HandlerMethodArgumentResolver和HandlerMethodReturnValueHandler

ParameterNameDiscoverer

解析方法參數名稱

  • StandardReflectionParameterNameDiscoverer:需開啓java8 ‘-parameters’ 編譯標誌
  • LocalVariableTableParameterNameDiscoverer:使用ObjectWeb’s ASM分析字節碼中的本地變量表

HttpMessageConverter

  • ByteArrayHttpMessageConverter
  • StringHttpMessageConverter
  • ResourceHttpMessageConverter
  • ResourceRegionHttpMessageConverter
  • SourceHttpMessageConverter
  • AllEncompassingFormHttpMessageConverter
  • Jaxb2RootElementHttpMessageConverter
  • MappingJackson2HttpMessageConverter

內容協商完畢,確定好要使用的消息轉換器,開始轉換之前先執行RequestResponseBodyChain切面(自定義ResponseBodyAdvice),之後轉換,刷出到Servlet OutputStream,準備相應頭部

HandlerExceptionResolver

異常處理

  • DefaultErrorAttributes: 存儲錯誤相關屬性
  • HandlerExceptionResolverComposite: 所有自定義異常處理器+DefaultHandlerExceptionResolver的組合
  • SimpleMappingExceptionResolver:異常類名稱和錯誤視圖名稱之間的映射
  • DefaultHandlerExceptionResolver:解決了Spring MVC引發的異常,並將它們映射到HTTP狀態碼
  • ResponseStatusExceptionResolver:使用 @ResponseStatus 註解解決異常,並根據註解中的值將其映射到HTTP狀態碼
  • ExceptionHandlerExceptionResolver:通過調用 @Controller@ControllerAdvice 類中的 @ExceptionHandler 方法來解決異常

LocalResolver

語言解析

  • FixedLocalResolver:固定的語言信息
  • AcceptHeaderLocalResolver: 通過請求頭部的語言信息來進行多語言選擇
  • CookieLocalResolver:將語言信息設置到Cookie中
  • SessionLocalResolver:將語言信息放到Session中

ViewResolver

視圖解析

  • BeanNameViewResolver:將視圖解析爲spring應用上下文中的bean,其中bean的id與視圖名稱相同
  • UrlBasedViewResolver:直接根據視圖的名稱解析視圖,視圖名稱會匹配一個物理視圖的定義
  • ContentNegotiatingViewResolver:通過考慮客戶端需要的內容類型來解析視圖,委託給一個能夠產生對應內容類型的視圖解析器
  • ThymeleafViewResolver:將視圖解析爲Thymeleaf模板
  • InternalResourceViewResolver:將視圖解析爲Web應用的內部資源(一般爲JSP)
  • ResourceBundleViewResolver: 將視圖解析爲資源bundle(一般爲屬性文件)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章