SpringMVC源码(七):HandlerAdapter适配器

  在MVC请求流程中,获取到Handler处理器后,会根据Handler处理器找到HandlerAdapter适配器。通过适配器的handle()方法,完成目标Controller处理器的调用。

  HandlerMappingAdapter组件主要作用是统一调用Controller处理器的方法,便于拓展。Controller类型不同,有多重实现方式,调用的方法就不是确定的。通过适配器模式,可以让每一个适配器对应一种controller的类型,来分别调用处理 这样在扩展的时候只需要增加一个适配器来扩展即可。

  SpringMVC默认实现Controller处理器的方式有三种,实现Controller接口、实现HttpRequestHandler接口、@Controller注解方式。 

  0        

  SpringMVC默认实现了三种handler处理器适配器,分别处理三种Controller处理器的实现。

 

  RequestMappingHandlerAdapter处理器适配器最为常用,本文以RequestMappingHandlerAdapter为例进行分析。

1、处理器适配器HandlerAdapter结构介绍

1.1、HandlerAdapter的核心方法

  handlerAdapter有两个核心的方法:supports()、handle(),所有的handlerAdapter都必须实现这两个方法。supports()用来判断是否当前适配器支持给定的handler处理器;handle()用来处理handler处理器的逻辑。

 

 1 // 处理器适配器
 2 public interface HandlerAdapter {
 3 
 4    // 当前handler适配器是否支持给定的handler处理器
 5    boolean supports(Object handler);
 6 
 7    // handle处理方法
 8    ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
 9 
10 }

 

1.2、HandlerAdapter初始化时机

  在源码(三):MVC九大内置组件初始化中中有提到,处理器适配器handlerAdapters为DispatcherServlet中的属性,在HandlerAdapter初始化时,会对handlerAdapters集合做初始化操作。handlerAdapters集合中有三个HandlerAdapter处理器适配器,分别为SimpleControllerHandlerAdapter、RequestMappingHandlerAdapter、HttpRequestHandlerAdapter。

2、HandlerAdapter适配器的获取

2.1、核心流程图

   

2.2、核心流程源码分析

  DispatcherServlet#getHandlerAdapter() 核心伪代码:

 1 // 获取处理器适配器
 2 protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {
 3    // 处理器适配器集合不为空
 4    if (this.handlerAdapters != null) {
 5       // 遍历处理器适配器集合
 6       for (HandlerAdapter adapter : this.handlerAdapters) {
 7          // 当前适配器是否支持handle处理器的处理
 8          if (adapter.supports(handler)) {
 9             // 返回支持的适配器
10             return adapter;
11          }
12       }
13    }
14    // 未找到合适的适配器,抛出异常
15    throw new ServletException("No adapter for handler [" + handler +
16          "]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler");
17 }

  遍历DispatcherServlet中handlerAdapters属性集合

  0

1、当前HandlerAdapter是否支持对handler的处理

  SpringMVC默认实现的三种HandlerAdapter,下面我们来看看默认实现的这三种处理器适配器的supports()方法

1.1、HttpRequestHandlerAdapter

  HttpRequestHandlerAdapter#supports() 核心代码

1 public boolean supports(Object handler) {
2    // 判断是 HttpRequestHandler 类型
3    return (handler instanceof HttpRequestHandler);
4 }

  HttpRequestHandlerAdapter支持实现了HttpRequestHandler接口的Controller控制器的适配处理。

1.2、SimpleControllerHandlerAdapter

  SimpleControllerHandlerAdapter#supports() 核心代码

 

1 public boolean supports(Object handler) {
2     // 判断是 Controller 类型
3     return (handler instanceof Controller);
4 }

 

  SimpleControllerHandlerAdapter支持实现了Controller接口的Controller控制器的适配处理。

1.3、RequestMappingHandlerAdapter

  RequestMappingHandlerAdapter中无supports()方法,由其父类AbstractHandlerMethodAdapter实现,AbstractHandlerMethodAdapter#supports()核心代码:

1 public final boolean supports(Object handler) {
2    // handler是HandlerMethod类型,RequestMappingHandlerAdapter#supportsInternal() 返回为true
3    return (handler instanceof HandlerMethod && supportsInternal((HandlerMethod) handler));
4 }

  RequestMappingHandlerAdapter支持使用@Controller注解的Controller控制器的适配处理。

2、获取匹配到的HandlerAdapter并返回

  

 

 

3、当前handler无匹配的HandlerAdapter,抛出异常

 

posted @ 2023-02-15 19:37  无虑的小猪  阅读(503)  评论(0编辑  收藏  举报