阅读本文需要 3 分钟
tips:本文属于 Spring MVC 请求流程 - 基于源码解读 的小分支
前言
上一篇讲了 getHandler 获取执行链,执行链里包括当前请求URL对应的 handler 以及拦截器,本篇将针对 getHandlerAdapter 进行讲述
DEBUG
在 org.springframework.web.servlet.DispatcherServlet#getHandlerAdapter 处打断点,看到有3个处理器适配器
- HttpRequestHandlerAdapter:用于处理实现了 HttpRequestHandler 的 handler
- SimpleControllerHandlerAdapter:用于处理实现了 Controller 的 handler
- RequestMappingHandlerAdapter:用于处理实例为 HandlerMethod 的 handler
通过查看 suppoerts
方法,三个适配器的匹配逻辑都是根据 handler 是否为某个类的子类来判断
显然,getHandlerAdapter 的入参 handler,就是上一步 HandlerMethod 的实例,所以适配器是 RequestMappingHandlerAdapter
后记
通常,我们开发Spring MVC 的 Handler 基本上使用注解,所以处理器适配器都是走 RequestMappingHandlerAdapter。
当然, Spring MVC 的 Handler还有别的,比如HttpRequestHandler接口、实现Controller接口以及原生的Servlet,但用起来都不方便。