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(一般为属性文件)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章