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 {
@Override
public boolean supports(Object handler) {
return (handler instanceof Controller);
}
@Override
public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return ((Controller) handler).handleRequest(request, response);
}
@Override
public long getLastModified(HttpServletRequest request, Object handler) {
return -1;
}
}
分析说明表
步骤 | 说明 | 示例代码/注释 |
---|---|---|
方法签名解析 | 分析方法的访问修饰符、返回类型和参数 | protected HandlerAdapter getHandlerAdapter(Object handler) |
遍历适配器列表 | 遍历 this.handlerAdapters 列表,寻找支持当前处理器的适配器 |
for (HandlerAdapter adapter : this.handlerAdapters) |
检查适配器是否支持处理器 | 调用 supports 方法检查适配器是否支持当前处理器 |
if (adapter.supports(handler)) |
返回或抛出异常 | 返回支持的适配器或抛出 ServletException 异常 |
return adapter; 或 throw new ServletException |
HandlerAdapter接口解析 | 介绍 HandlerAdapter 接口的三个方法及其作用 |
boolean supports(Object handler); |
示例适配器实现 | 提供 SimpleControllerHandlerAdapter 的实现示例,说明如何判断和处理请求 |
public boolean supports(Object handler) {...} |
结论
DispatcherServlet
的 getHandlerAdapter
方法是Spring MVC处理请求的核心部分之一。它通过遍历预定义的 HandlerAdapter
列表,找到适用于当前处理器的适配器,并调用适配器执行具体的处理逻辑。理解这个方法有助于深入了解Spring MVC的工作机制和扩展点。