lifullmoon

该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读

Spring 版本:5.2.4.RELEASE

该系列其他文档请查看:《精尽 Spring MVC 源码分析 - 文章导读》

HandlerAdapter 组件

HandlerAdapter 组件,处理器的适配器。因为处理器 handler 的类型是 Object 类型,需要有一个调用者来实现 handler 是怎么被执行。Spring 中的处理器的实现多变,比如用户的处理器可以实现 Controller 接口或者 HttpRequestHandler 接口,也可以用 @RequestMapping 注解将方法作为一个处理器等,这就导致 Spring MVC 无法直接执行这个处理器。所以这里需要一个处理器适配器,由它去执行处理器

由于 HandlerMapping 组件涉及到的内容较多,考虑到内容的排版,所以将这部分内容拆分成了五个模块,依次进行分析:

  • 《HandlerAdapter 组件(一)之 HandlerAdapter》
  • 《HandlerAdapter 组件(二)之 ServletInvocableHandlerMethod》
  • 《HandlerAdapter 组件(三)之 HandlerMethodArgumentResolver》
  • 《HandlerAdapter 组件(四)之 HandlerMethodReturnValueHandler》
  • 《HandlerAdapter 组件(五)之 HttpMessageConverter》

HandlerAdapter 组件(二)之 ServletInvocableHandlerMethod

本文是接着《HandlerAdapter 组件(一)之 HandlerAdapter》一文来分享 ServletInvocableHandlerMethod 组件。在 HandlerAdapter 执行处理器的过程中,主要的任务还是交由它来完成的。ServletInvocableHandlerMethod 封装 HandlerMethod 处理器对象,它还包含 HandlerMethodArgumentResolver 参数解析器和 HandlerMethodReturnValueHandler 返回值处理器等组件。虽然内容不多,但还是有必要另一篇进行分析。

回顾

先来回顾一下 RequestMappingHandlerAdapter 是如何创建 ServletInvocableHandlerMethod 对象的,可以回到 《HandlerAdapter 组件(一)之 HandlerAdapter》RequestMappingHandlerAdapter 小节下面的 invokeHandlerMethod 方法,如下:

@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request, HttpServletResponse response, 
                                           HandlerMethod handlerMethod) throws Exception {
    // ... 省略相关代码
    // <4> 创建 ServletInvocableHandlerMethod 对象,并设置其相关属性
    ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
    if (this.argumentResolvers != null) {
        invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
    }
    if (this.returnValueHandlers != null) {
        invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
    }
    invocableMethod.setDataBinderFactory(binderFactory);
    invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
	// ... 省略相关代码
    // <9> 执行调用
    invocableMethod.invokeAndHandle(webRequest, mavContainer);
    // ... 省略相关代码
}

protected ServletInvocableHandlerMethod createInvocableHandlerMethod(HandlerMethod handlerMethod) {
    return new ServletInvocableHandlerMethod(handlerMethod);
}
  • HandlerMethod 处理器封装成 ServletInvocableHandlerMethod 对象,然后设置参数解析器和返回值处理器

  • 这里设置了 ServletInvocableHandlerMethod 对象的 resolversparameterNameDiscovererreturnValueHandlers 相关属性

  • 调用invokeAndHandle(ServletWebRequest webRequest, ModelAndViewContainer mavContainer, Object... providedArgs)方法,执行处理器

类图

ServletInvocableHandlerMethod 的整体类图如下:

依次分析

HandlerMethod

org.springframework.web.method.HandlerMethod,处理器的方法的封装对象

《HandlerMapping 组件(三)之 AbstractHandlerMethodMapping》AbstractHandlerMethodMapping 小节中已经分析过该对象

InvocableHandlerMethod

org.springframework.web.method.support.InvocableHandlerMethod,继承 HandlerMethod 类,可 invoke 调用的 HandlerMethod 实现类。

相关文章:

  • 2020-12-23
  • 2022-12-23
  • 2021-04-24
  • 2021-06-12
  • 2021-06-29
  • 2021-09-18
  • 2022-01-19
  • 2021-05-22
猜你喜欢
  • 2020-12-17
  • 2020-12-18
  • 2020-12-21
  • 2020-12-21
  • 2020-12-22
  • 2020-12-22
  • 2020-12-23
相关资源
相似解决方案