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");
}
​
AI 代码解读

方法解析

  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);
}
​
AI 代码解读
  • 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;
    }
}
​
AI 代码解读

分析说明表

步骤 说明 示例代码/注释
方法签名解析 分析方法的访问修饰符、返回类型和参数 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的工作机制和扩展点。

目录
打赏
0
0
0
0
448
分享
相关文章
Spring 集成 DeepSeek 的 3大方法(史上最全)
DeepSeek 的 API 接口和 OpenAI 是兼容的。我们可以自定义 http client,按照 OpenAI 的rest 接口格式,去访问 DeepSeek。自定义 Client 集成DeepSeek ,可以通过以下步骤实现。步骤 1:准备工作访问 DeepSeek 的开发者平台,注册并获取 API 密钥。DeepSeek 提供了与 OpenAI 兼容的 API 端点(例如),确保你已获取正确的 API 地址。
Spring 集成 DeepSeek 的 3大方法(史上最全)
【Spring】方法注解@Bean,配置类扫描路径
@Bean方法注解,如何在同一个类下面定义多个Bean对象,配置扫描路径
209 73
Spring MVC源码分析之DispatcherServlet#getHandlerAdapter方法
`DispatcherServlet`的 `getHandlerAdapter`方法是Spring MVC处理请求的核心部分之一。它通过遍历预定义的 `HandlerAdapter`列表,找到适用于当前处理器的适配器,并调用适配器执行具体的处理逻辑。理解这个方法有助于深入了解Spring MVC的工作机制和扩展点。
77 1
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于 xml 的整合
本教程介绍了基于XML的MyBatis整合方式。首先在`application.yml`中配置XML路径,如`classpath:mapper/*.xml`,然后创建`UserMapper.xml`文件定义SQL映射,包括`resultMap`和查询语句。通过设置`namespace`关联Mapper接口,实现如`getUserByName`的方法。Controller层调用Service完成测试,访问`/getUserByName/{name}`即可返回用户信息。为简化Mapper扫描,推荐在Spring Boot启动类用`@MapperScan`注解指定包路径避免逐个添加`@Mapper`
29 0
微服务——SpringBoot使用归纳——Spring Boot集成Thymeleaf模板引擎——Thymeleaf 介绍
本课介绍Spring Boot集成Thymeleaf模板引擎。Thymeleaf是一款现代服务器端Java模板引擎,支持Web和独立环境,可实现自然模板开发,便于团队协作。与传统JSP不同,Thymeleaf模板可以直接在浏览器中打开,方便前端人员查看静态原型。通过在HTML标签中添加扩展属性(如`th:text`),Thymeleaf能够在服务运行时动态替换内容,展示数据库中的数据,同时兼容静态页面展示,为开发带来灵活性和便利性。
34 0
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——少量配置信息的情形
本课主要讲解Spring Boot项目中的属性配置方法。在实际开发中,测试与生产环境的配置往往不同,因此不应将配置信息硬编码在代码中,而应使用配置文件管理,如`application.yml`。例如,在微服务架构下,可通过配置文件设置调用其他服务的地址(如订单服务端口8002),并利用`@Value`注解在代码中读取这些配置值。这种方式使项目更灵活,便于后续修改和维护。
16 0
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— application.yml 中对日志的配置
在 Spring Boot 项目中,`application.yml` 文件用于配置日志。通过 `logging.config` 指定日志配置文件(如 `logback.xml`),实现日志详细设置。`logging.level` 可定义包的日志输出级别,例如将 `com.itcodai.course03.dao` 包设为 `trace` 级别,便于开发时查看 SQL 操作。日志级别从高到低为 ERROR、WARN、INFO、DEBUG,生产环境建议调整为较高级别以减少日志量。本课程采用 yml 格式,因其层次清晰,但需注意格式要求。
35 0
|
13天前
|
基于SpringBoot的Redis开发实战教程
Redis在Spring Boot中的应用非常广泛,其高性能和灵活性使其成为构建高效分布式系统的理想选择。通过深入理解本文的内容,您可以更好地利用Redis的特性,为应用程序提供高效的缓存和消息处理能力。
119 79
微服务——SpringBoot使用归纳——Spring Boot集成Thymeleaf模板引擎——Thymeleaf 的使用
本文介绍了 Thymeleaf 在 Spring Boot 项目中的使用方法,包括访问静态页面、处理对象和 List 数据、常用标签操作等内容。通过示例代码展示了如何配置 404 和 500 错误页面,以及如何在模板中渲染对象属性和列表数据。同时总结了常用的 Thymeleaf 标签,如 `th:value`、`th:if`、`th:each` 等,并提供了官方文档链接以供进一步学习。
50 0
微服务——SpringBoot使用归纳——Spring Boot集成Thymeleaf模板引擎——Thymeleaf 的使用
详细介绍SpringBoot启动流程及配置类解析原理
通过对 Spring Boot 启动流程及配置类解析原理的深入分析,我们可以看到 Spring Boot 在启动时的灵活性和可扩展性。理解这些机制不仅有助于开发者更好地使用 Spring Boot 进行应用开发,还能够在面对问题时,迅速定位和解决问题。希望本文能为您在 Spring Boot 开发过程中提供有效的指导和帮助。
96 12

热门文章

最新文章