Spring MVC源码分析之DispatcherServlet#getHandlerAdapter方法

简介: `DispatcherServlet`的 `getHandlerAdapter`方法是Spring MVC处理请求的核心部分之一。它通过遍历预定义的 `HandlerAdapter`列表,找到适用于当前处理器的适配器,并调用适配器执行具体的处理逻辑。理解这个方法有助于深入了解Spring MVC的工作机制和扩展点。

Spring MVC源码分析之DispatcherServlet#getHandlerAdapter方法

Spring MVC是Spring框架中的一个重要模块,用于处理Web请求。DispatcherServlet是Spring MVC的前端控制器,负责将请求分发到合适的处理器。本文将深入分析 DispatcherServletgetHandlerAdapter方法,该方法用于获取请求处理器的适配器。

getHandlerAdapter方法简介

DispatcherServletgetHandlerAdapter方法的主要作用是根据处理器(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");
}
​

方法解析

  1. 方法签名

    • protected:方法受保护,子类可以访问。
    • @Nullable:方法可以返回 null,但在当前实现中总是返回一个非 nullHandlerAdapter或抛出异常。
    • Object handler:传入的处理器对象。
    • throws ServletException:方法可能会抛出 ServletException
  2. 核心逻辑

    • 遍历 this.handlerAdapters,这是一个 HandlerAdapter列表。
    • 调用每个 HandlerAdaptersupports方法,检查其是否支持当前处理器。
    • 如果找到支持当前处理器的 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实现,例如 SimpleControllerHandlerAdapterRequestMappingHandlerAdapter等。以下是 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) {...}

结论

DispatcherServletgetHandlerAdapter方法是Spring MVC处理请求的核心部分之一。它通过遍历预定义的 HandlerAdapter列表,找到适用于当前处理器的适配器,并调用适配器执行具体的处理逻辑。理解这个方法有助于深入了解Spring MVC的工作机制和扩展点。

目录
相关文章
|
7月前
|
监控 Java 应用服务中间件
Spring Boot整合Tomcat底层源码分析
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置和起步依赖等特性,大大简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是其与Tomcat的整合。
174 1
|
2月前
|
缓存 安全 Java
深入解析HTTP请求方法:Spring Boot实战与最佳实践
这篇博客结合了HTTP规范、Spring Boot实现和实际工程经验,通过代码示例、对比表格和架构图等方式,系统性地讲解了不同HTTP方法的应用场景和最佳实践。
222 5
|
2月前
|
Java Spring 容器
两种Spring Boot 项目启动自动执行方法的实现方式
在Spring Boot项目启动后执行特定代码的实际应用场景中,可通过实现`ApplicationRunner`或`CommandLineRunner`接口完成初始化操作,如系统常量或配置加载。两者均支持通过`@Order`注解控制执行顺序,值越小优先级越高。区别在于参数接收方式:`CommandLineRunner`使用字符串数组,而`ApplicationRunner`采用`ApplicationArguments`对象。注意,`@Order`仅影响Bean执行顺序,不影响加载顺序。
121 2
|
4月前
|
人工智能 自然语言处理 Java
Spring 集成 DeepSeek 的 3大方法(史上最全)
DeepSeek 的 API 接口和 OpenAI 是兼容的。我们可以自定义 http client,按照 OpenAI 的rest 接口格式,去访问 DeepSeek。自定义 Client 集成DeepSeek ,可以通过以下步骤实现。步骤 1:准备工作访问 DeepSeek 的开发者平台,注册并获取 API 密钥。DeepSeek 提供了与 OpenAI 兼容的 API 端点(例如),确保你已获取正确的 API 地址。
Spring 集成 DeepSeek 的 3大方法(史上最全)
|
6月前
|
Java Spring
【Spring】方法注解@Bean,配置类扫描路径
@Bean方法注解,如何在同一个类下面定义多个Bean对象,配置扫描路径
249 73
|
5月前
|
监控 Java 应用服务中间件
SpringBoot是如何简化Spring开发的,以及SpringBoot的特性以及源码分析
Spring Boot 通过简化配置、自动配置和嵌入式服务器等特性,大大简化了 Spring 应用的开发过程。它通过提供一系列 `starter` 依赖和开箱即用的默认配置,使开发者能够更专注于业务逻辑而非繁琐的配置。Spring Boot 的自动配置机制和强大的 Actuator 功能进一步提升了开发效率和应用的可维护性。通过对其源码的分析,可以更深入地理解其内部工作机制,从而更好地利用其特性进行开发。
157 6
|
6月前
|
设计模式 XML Java
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
|
7月前
|
前端开发 Java Spring
Spring MVC源码分析之DispatcherServlet#getHandlerAdapter方法
`DispatcherServlet`的 `getHandlerAdapter`方法是Spring MVC处理请求的核心部分之一。它通过遍历预定义的 `HandlerAdapter`列表,找到适用于当前处理器的适配器,并调用适配器执行具体的处理逻辑。理解这个方法有助于深入了解Spring MVC的工作机制和扩展点。
74 0
|
3月前
|
前端开发 Java 数据库
微服务——SpringBoot使用归纳——Spring Boot集成Thymeleaf模板引擎——Thymeleaf 介绍
本课介绍Spring Boot集成Thymeleaf模板引擎。Thymeleaf是一款现代服务器端Java模板引擎,支持Web和独立环境,可实现自然模板开发,便于团队协作。与传统JSP不同,Thymeleaf模板可以直接在浏览器中打开,方便前端人员查看静态原型。通过在HTML标签中添加扩展属性(如`th:text`),Thymeleaf能够在服务运行时动态替换内容,展示数据库中的数据,同时兼容静态页面展示,为开发带来灵活性和便利性。
103 0