RequestMappingHandlerAdapter
是日常项目中使用最多的HandlerAdapter
实现类。
它还有一个抽象父类AbstractHandlerMethodAdapter
,顾名思义,是专门用来处理HandlerMethod
类型的handler
。具体可以看AbstractHandlerMethodAdapter#supports
方法:
public final boolean supports(Object handler) {
return (handler instanceof HandlerMethod && supportsInternal((HandlerMethod) handler));
}
通过之前的学习可以知道,RequestMappingHandlerMapping
获取的handler
就是HandlerMethod
类型的。
RequestMappingHandlerMapping
和RequestMappingHandlerAdapter
就像一对孪生兄弟:
RequestMappingHandlerMapping
负责根据request
找到映射的handler
RequestMappingHandlerAdapter
负责根据handler
执行对应的方法
我们先总结RequestMappingHandlerAdapter
处理handler
的核心流程:
- 将
request
和response
封装成ServletWebRequest
对象。 - 将
handler
封装成ServletInvocableHandlerMethod
对象invocableMethod
。 - 为
invocableMethod
设置argumentResolvers
、returnValueHandlers
、dataBinderFactory
和parameterNameDiscoverer
等工具。 - 解析请求参数。
- 执行方法。
- 处理返回值。
实际上,RequestMappingHandlerAdapter
处理handler
过程中还有许多细节,比如前后端不分离项目的视图相关处理(没有必要花费时间深入学习),异步请求的相关处理(会另外写文章)。
0 预备知识
RequestMappingHandlerAdapter
中有许多成员变量,在请求处理过程中起着重要的作用。
0.1 argumentResolvers
argumentResolvers
是参数解析器,RequestMappingHandlerAdapter
使用argumentResolvers
进行参数解析。
简单来说,就是将HTTP请求中的数据,转换成handler
方法中的形参对象。
argumentResolvers
使用了组合模式,它的类型是HandlerMethodArgumentResolverComposite
,其内部缓存HandlerMethodArgumentResolver
对象,用来进行参数解析。
HandlerMethodArgumentResolverComposite
中包含argumentResolvers
和argumentResolverCache
两个成员变量。在初始化时,会将所有配置的参数解析器缓存到argumentResolvers
中。第一次解析参数时,会遍历argumentResolvers
获取对应参数解析器,并缓存到argumentResolverCache
中,后续再次解析该参数可直接从键值对中获取,提高效率。
实际进行参数解析的是HandlerMethodArgumentResolver
实现类。它们使用了策略模式,通过supportsParameter()
方法获取支持的参数解析器,通过resolveArgument()
方法进行参数解析。
0.2 customArgumentResolvers
customArgumentResolvers
是用于缓存开发人员自定义的参数解析器,即通过WebMvcConfigurer#addArgumentResolvers()
方法添加的解析器。
在RequestMappingHandlerAdapter
初始化时,会将customArgumentResolvers
中的自定义参数解析器添加到argumentResolvers
中。
0.3 returnValueHandlers
returnValueHandlers
是返回值处理器,它可以对控制层业务返回值进行处理。
例如,对@ResponseBody
标注的返回值进行JSON格式化,并写到输出流。
returnValueHandlers
使用了组合模式,它的类型是HandlerMethodReturnValueHandlerComposite
,其内部缓存HandlerMethodReturnValueHandler
对象,用来进行返回值处理。
0.4 customReturnValueHandlers
customReturnValueHandlers
是用于缓存开发人员自定义的参数解析器,即通过WebMvcConfigurer#addReturnValueHandlers()
方法添加的解析器。
在RequestMappingHandlerAdapter
初始化时,会将customReturnValueHandlers
中的自定义参数解析器添加到returnValueHandlers
中。
1 初始化流程
在RequestMappingHandlerAdapter
内部,有两个方法用于初始化。一个是构造函数,另一个是实现org.springframework.beans.factory.InitializingBean
的afterPropertiesSet()
方法。
在Spring Boot中,会在WebMvcConfigurationSupport
中进行完整的初始化。
1.1 构造函数
构造函数中主要是对messageConverters
进行初始化,添加一些必备的消息转换器。实际上,WebMvcConfigurationSupport
中会进行覆盖,因此不过多描述:
public RequestMappingHandlerAdapter() {
this.messageConverters = new ArrayList<>(4);
this.messageConverters.add(new ByteArrayHttpMessageConverter());
this.messageConverters.add(new StringHttpMessageConverter());
if (!shouldIgnoreXml) {
try {
this.messageConverters.add(new SourceHttpMessageConverter<>());
}
catch (Error err) {
// Ignore when no TransformerFactory implementation is available
}
}
this.messageConverters.add(new AllEncompassingFormHttpMessageConverter()