SpringMVC【三】HandlerAdapter
- 版本说明:5.1.3-RELEASE
我们之前针对DispatcherServlet,HandlerMapping做了介绍,本文将介绍HandlerAdapter;我们先看看HandlerAdapter具体定义了哪些接口?
HandlerAdapter
HandlerAdapter通过接口我们知道HandlerAdapter具体的功能包括校验(supports)、实例处理(handle)、以及获取lastModified;那么我们紧接着看看子类是如何实现这些功能的,以下是HandlerAdapter的继承实现结构。
HandlerAdapter继承结构我们依次来了解每个HandlerAdapter的具体实现。
HttpRequestHandlerAdapter
HttpRequestHandlerAdapter1.HttpRequestHandlerAdapter支持handler对象为HttpRequestHandler类型
2.调用HttpRequestHandler.handleRequest()处理业务逻辑
3.当实现LastModified接口时则支持lastModified
SimpleServletHandlerAdapter
SimpleServletHandlerAdapter1.SimpleServletHandlerAdapter支持handler对象为Servlet类型
2.调用Servlet.service()处理业务逻辑
3.不支持LastModified
SimpleControllerHandlerAdapter
SimpleControllerHandlerAdapter1.SimpleControllerHandlerAdapter支持handler对象为Controller类型
2.调用Controller.handleRequest()处理业务逻辑
3.当实现LastModified接口时则支持lastModified
注意:这里的Controller并非@Controller注解,而是 org.springframework.web.servlet.mvc.Controller 接口,并且该接口定义了handleRequest方法。
AbstractHandlerMethodAdapter
以上HandlerAdapter实现比较简单,我们就不做过多的描述;而AbstractHandlerMethodAdapter以及其子类RequestMappingHandlerAdapter实现比较复杂,并且最为常用;我们一起来看看
AbstractHandlerMethodAdapter1.AbstractHandlerMethodAdapter 主要限制了Handler对象需要是HandlerMethod实例
2.定义了抽象方法supportsInternal,handleInternal,getLastModifiedInternal由子类实现
RequestMappingHandlerAdapter
RequestMappingHandlerAdapter invokeHandlerMethodRequestMappingHandlerAdapter实现了父类AbstractHandlerMethodAdapter定义的抽象方法,对于supportsInternal,getLastModifiedInternal实现比较清晰,我们不做过多说明,对于handleInternal实现比较复杂,我们展开来说。
HandlerMethod继承关系1.首先根据request,response构建ServletWebRequest实例
2.构建HandlerMethod的子类InvocableHandlerMethod
3.设置参数处理器,返回值处理等
4.创建ModelAndView容器
5.调用invocableMethod.invokeAndHandle方法,该方法由InvocableHandlerMethod实现,其本质是通过反射的方式调用原方法。
明确“三剑客”的关系
通过上篇SpringMVC【二】HandlerMapping,以及以上HandlerAdapter的介绍,我们一起梳理一下HandlerMapping,HandlerAdapter,HandlerExecutionChain 三者之间的关系。
HandlerMapping
HandlerMapping是一个接口,主要的作用是getHandler,返回HandlerExecutionChain对象;同时其实现类也包含了如何包装HandlerExecutionChain对象,以及注册Handler的过程。
HandlerExecutionChain
HandlerExecutionChain是一个类,它的成员变量包括interceptors以及以及具体的Handler 对象,Handler对象的类型没有限制是Object
HandlerAdapter
HandlerAdapter也是一个接口,支持传入Handler Object判断是否支持,执行Handler对象的处理逻辑等功能;其中Handler是HandlerExecutionChain的成员变量Object Handler。
总结
1.了解HandlerAdapter支持的Handler对象
2.清楚HandlerAdapter是如何调用handle方法处理业务逻辑
3.明白各种HandlerAdapter使用的场景
4.理清楚HandlerAdapter、HandlerMapping以及HandlerExecutionChain三者之间的关系