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

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

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

wKiom1hD9wnQL7S2AAAY6K0VLVQ981.png


作用

SimpleServletHandlerAdapter

处理Servlet 接口

默认不激活

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


1.HandlerAdapter 初始时机


wKioL1hD-_GhqILoAADDvcLTTis254.png

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

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

SimpleControllerHandlerAdapter;

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

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

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

2.HandlerAdapter 工作原理

2.1 接口

wKioL1hD_jyiBwaQAAAQyEvc9co002.png

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的具体方法上。

wKiom1hD_mKzs51gAAA3smKYOlE443.png

2.3 AnnotationMethodHandlerAdapter处理序列图

wKioL1hECVXTAUEtAADpKzdaGmQ005.png

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

  1. 匹配寻找合适的方法

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

wKiom1hEDHnxkNsUAABNPRzvNvA416.png