设为首页 加入收藏

TOP

RequestMappingHandlerAdapter详解(一)
2023-07-25 21:40:14 】 浏览:105
Tags:RequestMappingHandlerAdapter 详解

RequestMappingHandlerAdapter是日常项目中使用最多的HandlerAdapter实现类。

它还有一个抽象父类AbstractHandlerMethodAdapter,顾名思义,是专门用来处理HandlerMethod类型的handler。具体可以看AbstractHandlerMethodAdapter#supports方法:

public final boolean supports(Object handler) {  
   return (handler instanceof HandlerMethod && supportsInternal((HandlerMethod) handler));  
}

通过之前的学习可以知道,RequestMappingHandlerMapping获取的handler就是HandlerMethod类型的。

RequestMappingHandlerMappingRequestMappingHandlerAdapter就像一对孪生兄弟:

  1. RequestMappingHandlerMapping负责根据request找到映射的handler
  2. RequestMappingHandlerAdapter负责根据handler执行对应的方法

我们先总结RequestMappingHandlerAdapter处理handler的核心流程:

  1. requestresponse封装成ServletWebRequest对象。
  2. handler封装成ServletInvocableHandlerMethod对象invocableMethod
  3. invocableMethod设置argumentResolversreturnValueHandlersdataBinderFactoryparameterNameDiscoverer等工具。
  4. 解析请求参数。
  5. 执行方法。
  6. 处理返回值。

实际上,RequestMappingHandlerAdapter处理handler过程中还有许多细节,比如前后端不分离项目的视图相关处理(没有必要花费时间深入学习),异步请求的相关处理(会另外写文章)。

0 预备知识

RequestMappingHandlerAdapter中有许多成员变量,在请求处理过程中起着重要的作用。

0.1 argumentResolvers

argumentResolvers是参数解析器,RequestMappingHandlerAdapter使用argumentResolvers进行参数解析。

简单来说,就是将HTTP请求中的数据,转换成handler方法中的形参对象。

argumentResolvers使用了组合模式,它的类型是HandlerMethodArgumentResolverComposite,其内部缓存HandlerMethodArgumentResolver对象,用来进行参数解析。

HandlerMethodArgumentResolverComposite中包含argumentResolversargumentResolverCache两个成员变量。在初始化时,会将所有配置的参数解析器缓存到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.InitializingBeanafterPropertiesSet()方法。

在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()
首页 上一页 1 2 3 4 5 6 7 下一页 尾页 1/10/10
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇MyBatis配置解析 下一篇day13-功能实现12

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目