HandlerAdapter,处理器适配器,Spring MVC通过HandlerAdapter来实际调用处理方法。 当HandlerMapping获取了处理器,DispatcherServlet会将得到的Handler告知HandlerAdapter,HandlerAdapter再根据请求去定位请求的具体处理方法是哪一个。
MVC框架SPI,核心MVC工作流程,允许参数。
接口,必须为每个处理程序类型来处理的请求来实现。 该接口用于允许DispatcherServlet是无限扩展。 在DispatcherServlet通过这个接口访问所有已安装的处理程序,这意味着它不包含特定的代码处理各种事务的类型。 需要注意的是处理程序的类型可以是的Object 。 这是为了让其他框架中的处理程序使用此框架结合,而不定制编码,以及允许那些不服从任何特定的Java接口注解驱动的处理程序对象。 此接口不用于应用程序开发。 它是提供给谁想要开发自己的Web工作流程处理程序。 注意: HandlerAdapter实现者可以实现org.springframework.core.Ordered接口能够指定用于通过得到施加的排列顺序(并且因此优先级) DispatcherServlet 。 无序情况下得到的待遇是最低的优先级。
流程
1.DispatcherServlte会根据配置文件信息注册HandlerAdapter,如果在配置文件中没有配置,那么 DispatcherServlte会获取HandlerAdapter的默认配置,如果是读取默认配置的话,DispatcherServlte会读取 DispatcherServlte.properties文件,该文件中配置了三种 HandlerAdapter:HttpRequestHandlerAdapter,SimpleControllerHandlerAdapter和 AnnotationMethodHandlerAdapter。DispatcherServlte会将这三个HandlerAdapter对象存储到 它的handlerAdapters这个集合属性中,这样就完成了HandlerAdapter的注册。
2.DispatcherServlte会根据handlerMapping传过来的controller与已经注册好了的HandlerAdapter 一一匹配,看哪一种HandlerAdapter是支持该controller类型的,如果找到了其中一种HandlerAdapter是支持传过来的 controller类型,那么该HandlerAdapter会调用自己的handle方法,handle方法运用Java的 反射机制执行controller的具体方法来获得ModelAndView,例如SimpleControllerHandlerAdapter是支持 实现了controller接口的控制器,如果自己写的控制器实现了controller接口,那么 SimpleControllerHandlerAdapter就会去执行自己写控制器中的具体方法来完成请求。
作用
- HandlerAdapter定义了如何处理请求的策略,通过请求url、请求Method和处理器的requestMapping定义,最终确定使用处理类的哪个方法来处理请求,并检查处理类相应处理方法的参数以及相关的Annotation配置,确定如何转换需要的参数传入调用方法,并最终调用返回ModelAndView。
- DispatcherServlet中根据HandlerMapping找到对应的handler method后,首先检查当前工程中注册的所有可用的handlerAdapter,根据handlerAdapter中的supports方法找到可以使用的handlerAdapter。
- 通过调用handlerAdapter中的handler方法来处理及准备handler method的参数及annotation(这就是spring mvc如何将request中的参数变成handle method中的输入参数的地方),最终调用实际的handler method。
总结
handlerAdapter这个类的作用就是接过handlermapping解析请求得到的handler对象。再更精确的定位到能够执行请求的方法。