spring mvc框架通过DispatcherServlet来作请求分发,主要由HandlerMapping,HandlerAdapter,HandlerInterceptor三个抽象来完成。通过HandlerMapping得到HandlerExcecutionChain,其主要由HandlerInterceptor及对应的handler构成,HandlerAdapter来适配handler.
1、DispatcherServle
基于模板方法模式设计
2、框架抽象
2.1、HandlerMapping类层次
2.1.1 初始化
RequestMapping的初始化以RequestMappingHandlerMapping为例,主要是基于RequestMappingHandlerMapping和AbstractHandlerMethodMapping实现InitializingBean的接口afterPropertiesSet。
RequestMappingHandlerMapping中主要是初始化RequestMappingInfo.BuilderConfiguration,包括ContentNegotiationManager内容协商管理器,TrailingSlashMatch尾部slath匹配标识,后缀模式匹配,已注册的后缀模式匹配以及模式匹配器。
AbstractHandlerMethodMapping主要是提取所有bean中有@Controller和@RequestMapping注解的bean,然后在bean上使用MethodIntrospector.selectMethods提取有@RequestMapping注解的方法,创建RequestMappingInfo,注册到MappingRegistry中
其时序图为
2.1.2 获取HandlerExecutionChain
基于模板方法模式来完成的。
首先根据请求得到对应的Handler,以RequestMappingHandlerMapping为例,根据根据请求路径及初始化时生成的映射关系得到对应的HandlerMethod,然后根据adaptedInterceptors创建HandlerExecutionChain,如果有跨域配置,则添加对应的跨域相关的拦截器。
2.2、HandlerInterceptor类层次设计
2.3、HandlerExectutionChain
2.4、HandlerAdatper类层次设计
基于模板方法模式设计
2.4.1 Controller接口
2.4.2 HttpRequestHandler接口
2.4.3 HandlerFunction接口
2.5、WebDataBinder设计
其主要是在处理数据绑定时
@Controller或者@ControllerAdvicee注解的类中可以有@InitBinder方法,IniteBinder支持的参数解析器有
RequestParamMethodArgumentResolver |
RequestParamMapMethodArgumentResolver |
PathVariableMethodArgumentResolver |
PathVariableMapMethodArgumentResolver |
MatrixVariableMethodArgumentResolver |
MatrixVariableMapMethodArgumentResolver |
ExpressionValueMethodArgumentResolver |
SessionAttributeMethodArgumentResolver |
RequestAttributeMethodArgumentResolver |
ServletRequestMethodArgumentResolver |
ServletResponseMethodArgumentResolver |
PrincipalMethodArgumentResolver |
对于参数类型为WebDataBinder时,不会调用参数解析器,此时直接调用方法。
2.5.1 创建WebDataBinder
在DefaultDataBinderFactory使用模板方法模式来创建WebDataBinder,在ServletRequestDataBinderFactory中创建Binder实例,使用WebBindingInitializer来初始化实例,InitBinderDataBinderFactory中的initBinder来调用绑定的方法。
2.6、HandlerMethodArgumentResolver类设计
基于模板方法模式设计,来处理HandlerMethod的方法参数
注解或者类型 | 解析器 |
@RequestParam | RequestParamMethodArgumentResolver |
@RequestParam并且参数类型是Map.class以及子类 | RequestParamMapMethodArgumentResolver |
@PathVariable | PathVariableMethodArgumentResolver |
@PathVariable并且参数类型是Map.class以及子类 | PathVariableMapMethodArgumentResolver |
@MatrixVariable | MatrixVariableMethodArgumentResolver |
@MatrixVariable并且参数类型是Map.class以及子类 | MatrixVariableMapMethodArgumentResolver |
@ModelAttribute | ServletModelAttributeMethodProcessor |
@RequestBody | RequestResponseBodyMethodProcessor |
@RequestPart | RequestPartMethodArgumentResolver |
@RequestHeader | RequestHeaderMethodArgumentResolver |
@RequestHeader并且参数类型是Map.class以及子类 | RequestHeaderMapMethodArgumentResolver |
@CookieValue | ServletCookieValueMethodArgumentResolver |
@Value | ExpressionValueMethodArgumentResolver |
@SessionAttribute | SessionAttributeMethodArgumentResolver |
@RequestAttribute | RequestAttributeMethodArgumentResolver |
WebRequest及其子类 ServletRequest及其子类 MultipartRequest及其子类 HttpSession及其子类 Principal及其子类 InputStream及其子类 Reader及其子类 HttpMethod Local TimeZone ZoneId | ServletRequestMethodArgumentResolver |
ServletResponse及其子类 OutputStream及其子类 Writer及其子类 | ServletResponseMethodArgumentResolver |
HttpEntity RequestEntity | HttpEntityMethodProcessor |
RedirectAttributes及其子类 | RedirectAttributesMethodArgumentResolver |
Model及其子类 | ModelMethodProcessor |
Map及其子类并且注解个数为0 | MapMethodProcessor |
Errors及其子类 | ErrorsMethodArgumentResolver |
SessionStatus | SessionStatusMethodArgumentResolver |
UriComponentsBuilder ServletUriComponentsBuilder | UriComponentsBuilderMethodArgumentResolver |
Principal及其子类 | PrincipalMethodArgumentResolver |
@RequestParam | RequestParamMethodArgumentResolver |
@ModelAttribute或者!BeanUtils.isSimpleProperty | ServletModelAttributeMethodProcessor |
2.7、HandlerMethodReturnValueHandler类层次设计
类型或者注解 | Handler |
ModelAndView类及子类 | ModelAndViewMethodReturnValueHandler |
Model及其子类 | ModelMethodProcessor |
View及其子类 | ViewMethodReturnValueHandler |
ResponseEntity泛型类型或者参数类型为ResponseBodyEmitter的子类型或者是reactive类型 | ResponseBodyEmitterReturnValueHandler |
参数类型为StreamingResponseBody或者子类型 参数类型为ResponseEntity并且泛型参数为StreamingResponseBody或者子类型 | StreamingResponseBodyReturnValueHandler |
HttpEntity及其子类型并且不是RequestEntity及其子类型 | HttpEntityMethodProcessor |
HttpHeaders及其子类型 | HttpHeadersReturnValueHandler |
Callable及其子类型 | CallableMethodReturnValueHandler |
DeferredResult、ListenableFuture或者CompletionStage及其子类型 | DeferredResultMethodReturnValueHandler |
WebAsyncTask及其子类型 | AsyncTaskMethodReturnValueHandler |
方法上有@ModelAttribute或者没有注解并且返回类型不是BeanUtils.isSimpleProperty | ServletModelAttributeMethodProcessor |
类上或者方法上有@ResponseBody | RequestResponseBodyMethodProcessor |
void或者CharSequence及其子类 | ViewNameMethodReturnValueHandler |
Map及其子类 | MapMethodProcessor |
如果有模型视图解析器 | ModelAndViewResolverMethodReturnValueHandler |
2.8、HandlerExceptionResolver类层次设计
在有@Controller或者@ControllerAdvice注解的类中,有@ExceptionHandler注解方法时会解析,异常处理是在DispatcherServlet类中处理。在没有配置mappedHandlers和mappedHandlerClasses,默认是需要处理异常的。
2.8.1 初始化
ExceptionHandlerExceptionResolver的初始化为
2.8.2 异常支持的参数解析器及返回值处理器
支持的参数解析器
@SessionAttribute | SessionAttributeMethodArgumentResolver |
@RequestAttribute | RequestAttributeMethodArgumentResolver |
WebRequest及其子类 ServletRequest及其子类 MultipartRequest及其子类 HttpSession及其子类 Principal及其子类 InputStream及其子类 Reader及其子类 HttpMethod Local TimeZone ZoneId | ServletRequestMethodArgumentResolver |
ServletResponse及其子类 OutputStream及其子类 Writer及其子类 | ServletResponseMethodArgumentResolver |
RedirectAttributes及其子类 | RedirectAttributesMethodArgumentResolver |
Model及其子类 | ModelMethodProcessor |
Principal及其子类 | PrincipalMethodArgumentResolver |
支持的返回值处理器
ModelAndView类及子类 | ModelAndViewMethodReturnValueHandler |
Model及其子类 | ModelMethodProcessor |
View及其子类 | ViewMethodReturnValueHandler |
HttpEntity及其子类型并且不是RequestEntity及其子类型 | HttpEntityMethodProcessor |
方法上有@ModelAttribute或者没有注解并且返回类型不是BeanUtils.isSimpleProperty | ServletModelAttributeMethodProcessor |
类上或者方法上有@ResponseBody | RequestResponseBodyMethodProcessor |
void或者CharSequence及其子类 | ViewNameMethodReturnValueHandler |
Map及其子类 | MapMethodProcessor |
3、mvc config
其通过接口WebMvcConfigurer实现扩展。首先在WebMvcConfigurationSupport添加一些注解@Bean的方法,用于创建DispatcherServlet需要的维件,同时保留一些扩展方法。然后在DelegatingWebMvcConfiguration(添加了注解@Configuration,继承自WebMvcConfigurationSupport),其通过setConfigurers方法的set注入来添加自定义的WebMvcConfigurer。
4、Request Condition
用于匹配请求。其结构图
5、HttpMessageConverter
主要实现读写同时涉及是否可读、可写,将http消息转为实体,将实体转在http消息
6、ControllerAdvice及其相应Advice接口
RequestBodyAdvie和ResponseBodyAdvice主要提供了对Http body的处理扩展接口
详细参考:https://blog.csdn.net/xiexingshishu/article/details/121189722
6.1 ControllerAdvice初始化
先找到ControllerAdvice的bean,然后看是否实现RequestBodyAdvice,ResponseBodyAdvice,如果实现,则添加到RequestMappingHandlerAdatper中的requestResponseBodyAdviceBeans, 在创建RequestResponseBodyMethodProcessor时传入
7、mvc中的函数编程范式
主要通过RouteFunction,HandlerFilterFunction、HandlerFunction,RequestPredicate及相关Builder接口来实现。在框架上使用了模块方法模式、Builder模式。同时依赖mvc框架HandlerMapping,HandlerAdater接口。其类图为
8、DispatcherServlet初始化
通过servlet的init来完成 的