SpringMVC中,和HandlerMapping一样重要的一个组件,就是HandlerAdapter。

如果说HandlerMapping是沟通请求和后端Controller的桥梁。HandlerAdapter则是负责具体处理请求核心工作了,另外一个处理请求的责任系列拦截器,前面已经说过了。

HandlerMapping和HandlerAdapter,看名字怎么都像弟兄俩。确实两者关系不一般,所有解析出的HandlerMapping,都统统适配一个合适的HandlerAdapter来负责具体处理事务。

SpringMVC源码分析(7)剖析HandlerAdapter


作用

SimpleServletHandlerAdapter

处理Servlet 接口

默认不**

SimpleControllerHandlerAdapter
处理 Controller接口
HttpRequestHandlerAdapter  处理HttpRequestHandler 接口
AnnotationMethodHandlerAdapter
处理 handler methods 


1.HandlerAdapter 初始时机


SpringMVC源码分析(7)剖析HandlerAdapter

1.AnnotationDrivenBeanDefinitionParser.parse(),注册了AnnotationMethodHandlerAdapter;

2.AbstractHttpRequestHandlerBeanDefinitionParser.registerHandlerAdapterIfNecessary()注册了HttpRequestHandlerAdapter;
3.ViewControllerBeanDefinitionParser.registerHanderAdapter注册了

SimpleControllerHandlerAdapter;

4.ComplexWebApplicationContext.refresh()注册了SimpleServletHandlerAdapter,默认不**。

总结:HandlerAdapter是在解析标签时已经初始化完毕了。

介绍完了Adapter是如何初始化,初始化到容器中。接下来可以讨论内部实现原理了。

2.HandlerAdapter 工作原理

2.1 接口

SpringMVC源码分析(7)剖析HandlerAdapter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public interface HandlerAdapter {
    
   /**
    * 判断是否支持Handler
    */
   boolean supports(Object handler); 
    
   /**
    * Use the given handler to handle this request.
    * The workflow that is required may vary widely.
    * 使用Handler处理请求
    */
   ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
 
   /**
    * Same contract as for HttpServlet'
    */
   long getLastModified(HttpServletRequest request, Object handler);
 
}

2.2 AnnotationMethodHandlerAdapter介绍

AnnotationMethodHandlerAdapter是几个为数不多Handler中最重要的一个处理类。

通过它,可以将请求适配到匹配的某个Handler的具体方法上。

SpringMVC源码分析(7)剖析HandlerAdapter

2.3 AnnotationMethodHandlerAdapter处理序列图

SpringMVC源码分析(7)剖析HandlerAdapter

图画的感觉挺多,但总结起来,就做了两件事。

  1. 匹配寻找合适的方法

  2. 调用方法,构造mav视图

SpringMVC源码分析(7)剖析HandlerAdapter



本文转自 randy_shandong 51CTO博客,原文链接:http://blog.51cto.com/dba10g/1879373,如需转载请自行联系原作者

相关文章:

  • 2021-09-22
  • 2021-12-30
  • 2022-01-15
  • 2022-12-23
  • 2021-08-26
  • 2021-07-06
  • 2021-05-08
猜你喜欢
  • 2021-05-29
  • 2021-08-31
  • 2021-09-09
  • 2021-07-01
  • 2022-01-27
  • 2021-05-30
  • 2021-05-22
相关资源
相似解决方案