SpringMVC适配器处理请求过程
2022-03-21 01:43:13 3 举报
SpringMVC适配器处理请求过程
作者其他创作
大纲/内容
解析入参并执行方法
RequestMappingHandlerAdapter
initControllerAdviceCache()
ControllerAdviceBean.findAnnotatedBeans(getApplicationContext())
this.initBinderArgumentResolvers = new HandlerMethodArgumentResolverComposite().addResolvers(resolvers)
获取@InitBinder方法入参解析器,把他们放到入参解析器链initBinderArgumentResolvers中
afterPropertiesSet()
创建一个ModelFactory,@ModelAttribute啥的方法就会被引用进来
最终创建的是一个ServletRequestDataBinderFactory,持有所有@InitBinder的method方法们
给其提供入参解析器
循环这些ControllerAdviceBean,获取其中用实现RequestBodyAdvice或者ResponseBodyAdvice接口的类,把他们放到requestResponseBodyAdvice中
构造器
RequestMappingHandlerAdapter()
获取容器中所有用注解@ControllerAdvice标注的类,把他们解析成一个个ControllerAdviceBean
invocableMethod.setDataBinderFactory(binderFactory)
RequestMappingHandlerAdapter.handle()
初始化
获取入参解析器,把他们放到入参解析器链argumentResolvers中
this.argumentResolvers = new HandlerMethodArgumentResolverComposite().addResolvers(resolvers)
给其提供返回值解析器
循环这些ControllerAdviceBean,获取其中用@InitBinder标注的方法,把他们放到initBinderAdviceCache中
invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers)
将WebDataBinderFactory绑定到此ServletInvocableHandlerMethod中
往消息转化器池messageConverters添加ByteArrayHttpMessageConverter,StringHttpMessageConverter,SourceHttpMessageConverter,AllEncompassingFormHttpMessageConverter
this.returnValueHandlers = new HandlerMethodReturnValueHandlerComposite().addHandlers(handlers)
WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod)
循环这些ControllerAdviceBean,获取其中用@RequestMapping和@ModelAttribute标注的方法,把他们放到modelAttributeAdviceCache中
invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers)
获取返回值解析器,把他们放到返回值解析器链returnValueHandlers中
解析返回值
ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod)
不同的映射处理器(HandlerMapping) 映射出来的 handler 对象是不一样的。AbstractUrlHandlerMapping 映射器映射出来的是 handler 是 Controller 对象。AbstractHandlerMethodMapping 映射器映射出来的 handler 是 HandlerMethod 对象。除了RequestMappingHandlerAdapter,其他几种适配器不常用,因此本图主要分析 RequestMappingHandlerAdapter 适配器解析对应 handler 的执行流程
调用入口
把HandlerMethod包装为ServletInvocableHandlerMethod,具有invoke执行的能力
0 条评论
下一页