HandlerAdapter:处理器适配器,作用就是调用具体的方法处理用户发来的请求。当 handlerMapping 获取到执行请求的
Controller 时,DispatcherServlet 会根据 Controller 对应的 Controller 类型来调用相应的
HandlerAdapter 来进行处理。适配器涉及到的设计模式:适配器模式。
1. HandlerAdapter的注册
DispatcherServlet会根据配置文件信息注册HandlerAdapter,如果在配置文件中没有配置,那么DispatcherServlet会获取 HandlerAdapter的默认配置,如果是读取默认配置的话,DispatcherServlet 会读取 DispatcherServlet.properties 文件, 该文件中配置了三种 HandlerAdapter:
HttpRequestHandlerAdapter、SimpleControllerHandlerAdapter、AnnotationMethodHandlerAdapter
DispatcherServlet将这三个 HandlerAdapter 对象存储到它的handlerAdapters这个集合属性中,这样就完成了 HandlerAdapter的注册。
2. HandlerAdapter 的执行
DispatcherServlet会根据handlerMapping传过来的controller与已经注册好了的HandlerAdapter相匹配,看哪一种HandlerAdapter是支持该controller类型的,如果找到了其中一种HandlerAdapter是支持传过来的controller类型,那么该HandlerAdapter会调用自己的handle方法,handle方法运用Java反射机制执行controller的具体方法来获得ModelAndView,例如SimpleControllerHandlerAdapter是支持实现了 controller接口的控制器,如果自己写的控制器实现了controller接口,那SimpleControllerHandlerAdapter 就会去执行自己写控制器中的具体方法来完成请求。通过查看SpringMVC源码,发现处理器不只有 Controller这一种。还有HttpRequestHandler,Servlet等处理器。
下面来介绍一下几种适配器对应的处理器以及这些处理器的作用:
- AnnotationMethodHandlerAdapter:适配注解类处理器,也就是常用的@Controller注解
- HttpRequestHandlerAdapter:适配静态资源处理器,静态资源处理器就是实现了HttpRequestHandler
接口的处理器,这类处理器的作用是处理通过SpringMVC来访问的静态资源的请求。 - impleControllerHandlerAdapter:Controller处理适配器,适配实现了Controller接口或
Controller接口子类的处理器,比如我们经常自己写的Controller 来继承MultiActionController。 - SimpleServletHandlerAdapter:Servlet处理适配器,适配实现了Servlet接口或Servlet的子类的处理器,我们不仅可以在web.xml里面配置Servlet,其实也可以用SpringMVC来配置Servlet,不过这个适配器很少用到,而且SpringMVC 默认的适配器是前面三种。
SpringMVC三种默认处理器适配器正好对应了控制器的三种实现方式,可以参考我的另一篇博客:SpringMVC中Controller控制器的三种实现方式