spring-webmvc版本5.2.5,springboot版本2.2.6
一.HandlerAdapter是什么?
HandlerAdapter处理器适配,因为handlerMapping有好几种类型,有方法级别、有controller级别的、有静态资源,具体执行方式不统一,提供适配器包一层,让DispatcherServlet代码更干净,不会出现if else的分支判断;扩展性更好,增加handlerMapping/HandlerAdapter,可以实现对DispatcherServlet来说无感知
二.HandlerAdapter怎么来的?
1.DispatcherServlet调用init()方法时,如果允许全部的处理器(detectAllHandlerAdapters为true),则从spring ioc容器中取出所有detectAllHandlerAdapters类型的对象,并排序(所以HandlerAdapter的实例对象要实现Ordered排序接口)
2.sping ioc怎么会有HandlerAdapter的?
@EnableAutoConfiguration-->autoconfigure项目META-INF\spring.factories-->WebMvcAutoConfiguration配置类中在ioc容器中实例化了四个HandlerAdapter实例对象,RequestMappingHandlerAdapter(对方法级别的适配)、 HandlerFunctionAdapter、HttpRequestHandlerAdapter(加载静态资源返回给请求者,没有后续视图解析和渲染的过程)、 SimpleControllerHandlerAdapter(对controller级别的适配)
3.具体作用
HandlerAdapter接口有三个方法,supports判断是否支持的handler类型;ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler);//调用handler,让handler去处理请求,返回结果;getLastModified得到上次修改时间 ,实现简单缓存
RequestMappingHandlerAdapter为例说明:
RequestMappingHandlerAdapter:
最终生成ServletInvocableHandlerMethod对象,靠它来反射执行method