Loading... ### Spring MVC源码分析之DispatcherServlet#getHandlerAdapter方法 Spring MVC是Spring框架中的一个重要模块,用于处理Web请求。`DispatcherServlet`是Spring MVC的前端控制器,负责将请求分发到合适的处理器。本文将深入分析 `DispatcherServlet`的 `getHandlerAdapter`方法,该方法用于获取请求处理器的适配器。 ![](https://www.8kiz.cn/usr/uploads/2024/06/815918653.png) ### `getHandlerAdapter`方法简介 `DispatcherServlet`中 `getHandlerAdapter`方法的主要作用是根据处理器(handler)获取相应的处理器适配器(HandlerAdapter)。处理器适配器用于执行具体的处理器,适配不同类型的处理器,例如:控制器类、静态资源处理器等。 ### 源码分析 首先,我们来看一下 `getHandlerAdapter`方法的源码: ```java @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"); } ``` #### 方法解析 1. **方法签名**: - `protected`:方法受保护,子类可以访问。 - `@Nullable`:方法可以返回 `null`,但在当前实现中总是返回一个非 `null`的 `HandlerAdapter`或抛出异常。 - `Object handler`:传入的处理器对象。 - `throws ServletException`:方法可能会抛出 `ServletException`。 2. **核心逻辑**: - 遍历 `this.handlerAdapters`,这是一个 `HandlerAdapter`列表。 - 调用每个 `HandlerAdapter`的 `supports`方法,检查其是否支持当前处理器。 - 如果找到支持当前处理器的 `HandlerAdapter`,则返回该适配器。 - 如果没有找到支持当前处理器的适配器,则抛出 `ServletException`。 ### HandlerAdapter接口 为了更好地理解 `getHandlerAdapter`方法,我们需要了解 `HandlerAdapter`接口。`HandlerAdapter`接口定义了一个处理器适配器必须实现的方法: ```java 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`的部分实现: ```java 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的工作机制和扩展点。如果你需要进一步优化和管理你的Spring MVC应用,可以参考[更多相关内容](https://www.tsyvps.com)。 最后修改:2024 年 06 月 05 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏