大鹏一日同风起,扶摇直上九万里。这篇文章主要讲述SpringMVC之RequestMapping执行过程(HandlerAdapter篇)相关的知识,希望能为你提供帮助。
RequestMappingHandlerAdapter 是 SpringMVC 实现 参数解析 和 结果集处理 的核心类之一。其中,解析参数的接口为 HandlerMethodArgumentResolver;处理结果集的接口为 HandlerMethodReturnValueHandler。RequestMappingHandlerAdapter 实现了 InitializingBean,因此初始化的过程在 afterPropertiesSet() 方法中。在 getDefaultArgumentResolvers() 方法中,我们可以找到各种各样常见的参数是如何解析的。另外,在 getDefaultReturnValueHandlers() 方法中,我们可以找到各种各样常见的返回值是如何处理的。写在前面【SpringMVC之RequestMapping执行过程(HandlerAdapter篇)】如果想搞清楚 参数解析 和 结果集处理 的逻辑,RequestMappingHandlerAdapter 是我们必须要弄明白的类。
下面以一段 Hello World 代码为例:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class HelloController {
@RequestMapping(value="https://www.songbingjia.com/sayHello")
@ResponseBody
public String printHello(@RequestParam(defaultValue = "https://www.songbingjia.com/android/guest") String name) {
return "hello, " + name;
}
}
说得通俗一点,就是 printHello 执行之前,SpringMVC 框架干了点什么? printHello 返回值之后,SpringMVC 框架干了点什么? printHello 假如发生了异常,SpringMVC 框架又为我们看了点什么?
概述 RequestMappingHandlerAdapter
文章图片
RequestMappingHandlerAdapter 有两个成员变量:
- HandlerMethodArgumentResolverComposite 本身也是实现 HandlerMethodArgumentResolver 接口的,还包含一组 HandlerMethodArgumentResolver 接口实例,目的只是为了把适配器的遍历逻辑放在其中。
- HandlerMethodReturnValueHandlerComposite 实现了 HandlerMethodReturnValueHandler 接口,同时还包含一组 HandlerMethodReturnValueHandler 接口实例,目的也是包装循环的代码。
Spring中的InitializingBean接口的使用 介绍了 Spring Bean 初始化的两个方法,一个是实现 InitializingBean,另一个是 init-method 。那么复习一下,RequestMappingHandlerAdapter 加入到 Spring 容器中的时机是什么时候呢?
答:在 DispatcherServlet # initStrategies 中调用 initHandlerAdapters 初始化 处理器适配器。
想进一步了解该知识点的,可以参考这篇文章 详细解读 DispatcherServlet 初始化过程(带时序图)初始化 RequestMappingHandlerAdapter Bean 的过程如图所示:
文章图片
@Override
public void afterPropertiesSet() {
// Do this first, it may add ResponseBody advice beans
initControllerAdviceCache();
// 获取参数解析器
if (this.argumentResolvers == null) {
List<
HandlerMethodArgumentResolver>
resolvers = getDefaultArgumentResolvers();
this.argumentResolvers = new HandlerMethodArgumentResolverComposite().addResolvers(resolvers);
}
// @InitBinder 注解相关的参数解析器
if (this.initBinderArgumentResolvers == null) {
List<
HandlerMethodArgumentResolver>
resolvers = getDefaultInitBinderArgumentResolvers();
this.initBinderArgumentResolvers = new HandlerMethodArgumentResolverComposite().addResolvers(resolvers);
}
// 获取返回值处理器
if (this.returnValueHandlers == null) {
List<
HandlerMethodReturnValueHandler>
handlers = getDefaultReturnValueHandlers();
this.returnValueHandlers = new HandlerMethodReturnValueHandlerComposite().addHandlers(handlers);
}
}
总结RequestMappingHandlerAdapter 是 SpringMVC 实现 参数解析 和 结果集处理 的核心类之一。
其中,解析参数的接口为 HandlerMethodArgumentResolver
处理结果集的接口为 HandlerMethodReturnValueHandler
RequestMappingHandlerAdapter 实现了 InitializingBean,因此初始化的过程在 afterPropertiesSet() 方法中。
在 getDefaultArgumentResolvers() 方法中,我们可以找到各种各样常见的参数是如何解析的。
在 getDefaultReturnValueHandlers() 方法中,我们可以找到各种各样常见的返回值是如何处理的。
推荐阅读
- 第三次安卓
- Android数据库表
- appium 处理webview
- 联想电脑曝严重漏洞:安装全新Win7/Win 8依旧捆绑软件
- win8/win10系统删除自带微软输入法的办法
- win8/win8.1系统提示“目标文件夹访问被拒绝”怎样办
- win8系统怎样关闭文件索引技巧|win8关闭文件索引技巧的办法
- win8系统用360安全卫士打开驱动弹出80060004出错怎样办
- win8/win8.1系统怎样添加excel工作表个数