spring mvc框架设计与实现

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的方法参数

注解或者类型解析器
@RequestParamRequestParamMethodArgumentResolver
@RequestParam并且参数类型是Map.class以及子类RequestParamMapMethodArgumentResolver
@PathVariablePathVariableMethodArgumentResolver
@PathVariable并且参数类型是Map.class以及子类PathVariableMapMethodArgumentResolver
@MatrixVariableMatrixVariableMethodArgumentResolver
@MatrixVariable并且参数类型是Map.class以及子类MatrixVariableMapMethodArgumentResolver
@ModelAttributeServletModelAttributeMethodProcessor
@RequestBodyRequestResponseBodyMethodProcessor
@RequestPartRequestPartMethodArgumentResolver
@RequestHeaderRequestHeaderMethodArgumentResolver
@RequestHeader并且参数类型是Map.class以及子类RequestHeaderMapMethodArgumentResolver
@CookieValueServletCookieValueMethodArgumentResolver
@ValueExpressionValueMethodArgumentResolver
@SessionAttributeSessionAttributeMethodArgumentResolver
@RequestAttributeRequestAttributeMethodArgumentResolver

WebRequest及其子类

ServletRequest及其子类

MultipartRequest及其子类

HttpSession及其子类

Principal及其子类

InputStream及其子类

Reader及其子类

HttpMethod

Local

TimeZone

ZoneId

ServletRequestMethodArgumentResolver
ServletResponse及其子类
OutputStream及其子类
Writer及其子类
ServletResponseMethodArgumentResolver
HttpEntity
RequestEntity
HttpEntityMethodProcessor
RedirectAttributes及其子类RedirectAttributesMethodArgumentResolver
Model及其子类ModelMethodProcessor
Map及其子类并且注解个数为0MapMethodProcessor
Errors及其子类ErrorsMethodArgumentResolver
SessionStatusSessionStatusMethodArgumentResolver
UriComponentsBuilder
ServletUriComponentsBuilder
UriComponentsBuilderMethodArgumentResolver
Principal及其子类PrincipalMethodArgumentResolver
@RequestParamRequestParamMethodArgumentResolver
@ModelAttribute或者!BeanUtils.isSimplePropertyServletModelAttributeMethodProcessor

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.isSimplePropertyServletModelAttributeMethodProcessor
类上或者方法上有@ResponseBodyRequestResponseBodyMethodProcessor
void或者CharSequence及其子类ViewNameMethodReturnValueHandler
Map及其子类MapMethodProcessor
如果有模型视图解析器ModelAndViewResolverMethodReturnValueHandler

2.8、HandlerExceptionResolver类层次设计 

在有@Controller或者@ControllerAdvice注解的类中,有@ExceptionHandler注解方法时会解析,异常处理是在DispatcherServlet类中处理。在没有配置mappedHandlers和mappedHandlerClasses,默认是需要处理异常的。

2.8.1 初始化

ExceptionHandlerExceptionResolver的初始化为

2.8.2 异常支持的参数解析器及返回值处理器

支持的参数解析器

@SessionAttributeSessionAttributeMethodArgumentResolver
@RequestAttributeRequestAttributeMethodArgumentResolver

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.isSimplePropertyServletModelAttributeMethodProcessor
类上或者方法上有@ResponseBodyRequestResponseBodyMethodProcessor
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来完成 的

9、Cors

spring中mvc的跨域访问_多看多听多总结-CSDN博客

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kgduu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值