Spring MVC源码分析 DispatcherServlet#getHandlerAdapter方法
Spring MVC是Spring框架中的一个重要模块,用于处理Web请求。DispatcherServlet
是Spring MVC的前端控制器,负责将请求分发到合适的处理器。本文将深入分析 DispatcherServlet
的 getHandlerAdapter
方法,该方法用于获取请求处理器的适配器。
getHandlerAdapter
方法简介
DispatcherServlet
中 getHandlerAdapter
方法的主要作用是根据处理器(handler)获取相应的处理器适配器(HandlerAdapter)。处理器适配器用于执行具体的处理器,适配不同类型的处理器,例如:控制器类、静态资源处理器等。
源码分析
首先,我们来看一下 getHandlerAdapter
方法的源码:
@Nullable
protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {for (HandlerAdapter adapter : this.handlerAdapters) {if (adapter.supports(handler)) {return adapter;}}throw new ServletException("No adapter for handler [" + handler +"]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler");
}
方法解析
方法签名:
protected
:方法受保护,子类可以访问。@Nullable
:方法可以返回null
,但在当前实现中总是返回一个非null
的HandlerAdapter
或抛出异常。Object handler
:传入的处理器对象。throws ServletException
:方法可能会抛出ServletException
。
核心逻辑:
- 遍历
this.handlerAdapters
,这是一个HandlerAdapter
列表。 - 调用每个
HandlerAdapter
的supports
方法,检查其是否支持当前处理器。 - 如果找到支持当前处理器的
HandlerAdapter
,则返回该适配器。 - 如果没有找到支持当前处理器的适配器,则抛出
ServletException
。
- 遍历
HandlerAdapter接口
为了更好地理解 getHandlerAdapter
方法,我们需要了解 HandlerAdapter
接口。HandlerAdapter
接口定义了一个处理器适配器必须实现的方法:
public interface HandlerAdapter {boolean supports(Object handler);ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;long getLastModified(HttpServletRequest request, Object handler);
}
- supports(Object handler) :判断适配器是否支持给定的处理器。
- handle(HttpServletRequest request, HttpServletResponse response, Object handler) :处理请求并返回
ModelAndView
。 - getLastModified(HttpServletRequest request, Object handler) :返回处理器最后修改的时间。
适配器示例
Spring MVC提供了几个常用的 HandlerAdapter
实现,例如 SimpleControllerHandlerAdapter
、RequestMappingHandlerAdapter
等。以下是 SimpleControllerHandlerAdapter
的部分实现:
public class SimpleControllerHandlerAdapter implements HandlerAdapter {@Overridepublic boolean supports(Object handler) {return (handler instanceof Controller);}@Overridepublic ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {return ((Controller) handler).handleRequest(request, response);}@Overridepublic long getLastModified(HttpServletRequest request, Object handler) {return -1;}
}