九大基礎組件
- 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
- 合併已知的
@SessionAttribute
屬性列表 - 執行
@ModelAttribute
註釋的方法並添加 - 查找Handler方法中被
@ModelAttribute
註解標註又在@SessionAttributes
中存在的參數,若模型視圖容器中不存在則添加
WebDataBinderFactory
初始化自定義的web數據綁定器,例如:‘2020-01-01’ String-> Date
HandlerMethodArgumentResolver
解析請求參數
- RequestParamMethodArgumentResolver:把請求參數部分的值綁定到指定的方法參數上
- RequestHeaderMethodArgumentResolver:把請求header部分的值綁定到指定的方法參數上
- PathVariableMethodArgumentResolver:綁定請求路徑端點上的路徑變量
- ModelAttributeMethod
Processor
:模型屬性方法處理器,可綁定模型屬性參數 - RequestResponseBodyMethod
Processor
:解析用@RequestBody
註釋的方法參數、@ResponseBody
註釋的方法返回值, 讀取請求體時會先應用ResponseBodyAdvice
切面 - RequestPartMethodArgumentResolver:解析用
@RequestPart
註釋的方法參數 - … 多達30多種
- 自定義請求參數解析器
HandlerMethodReturnValueHandler
處理Handler方法返回值
- ViewNameMethodReturnValueHandler: 處理字符串類型視圖名返回值
- ModelAndViewMethodReturnValueHandler: 處理
ModelAndView
返回值 - ResponseBodyEmitterReturnValueHandler:處理ResponseEntity/ResponseBodyEmitter返回值
- RequestResponseBodyMethod
Processor
: 處理@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(一般爲屬性文件)