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的工作机制和扩展点。

目录
相关文章
|
25天前
|
人工智能 自然语言处理 Java
Spring 集成 DeepSeek 的 3大方法(史上最全)
DeepSeek 的 API 接口和 OpenAI 是兼容的。我们可以自定义 http client,按照 OpenAI 的rest 接口格式,去访问 DeepSeek。自定义 Client 集成DeepSeek ,可以通过以下步骤实现。步骤 1:准备工作访问 DeepSeek 的开发者平台,注册并获取 API 密钥。DeepSeek 提供了与 OpenAI 兼容的 API 端点(例如),确保你已获取正确的 API 地址。
Spring 集成 DeepSeek 的 3大方法(史上最全)
|
3月前
|
Java Spring
【Spring】方法注解@Bean,配置类扫描路径
@Bean方法注解,如何在同一个类下面定义多个Bean对象,配置扫描路径
196 73
|
4月前
|
前端开发 Java Spring
Spring MVC源码分析之DispatcherServlet#getHandlerAdapter方法
`DispatcherServlet`的 `getHandlerAdapter`方法是Spring MVC处理请求的核心部分之一。它通过遍历预定义的 `HandlerAdapter`列表,找到适用于当前处理器的适配器,并调用适配器执行具体的处理逻辑。理解这个方法有助于深入了解Spring MVC的工作机制和扩展点。
54 0
|
4月前
|
前端开发 Java Spring
Spring MVC源码分析之DispatcherServlet#getHandlerAdapter方法
`DispatcherServlet`的 `getHandlerAdapter`方法是Spring MVC处理请求的核心部分之一。它通过遍历预定义的 `HandlerAdapter`列表,找到适用于当前处理器的适配器,并调用适配器执行具体的处理逻辑。理解这个方法有助于深入了解Spring MVC的工作机制和扩展点。
73 1
|
20天前
|
Java 数据库 开发者
详细介绍SpringBoot启动流程及配置类解析原理
通过对 Spring Boot 启动流程及配置类解析原理的深入分析,我们可以看到 Spring Boot 在启动时的灵活性和可扩展性。理解这些机制不仅有助于开发者更好地使用 Spring Boot 进行应用开发,还能够在面对问题时,迅速定位和解决问题。希望本文能为您在 Spring Boot 开发过程中提供有效的指导和帮助。
69 12
|
23天前
|
Java 应用服务中间件 Maven
SpringBoot项目打包成war包
通过上述步骤,我们成功地将一个Spring Boot应用打包成WAR文件,并部署到外部的Tomcat服务器中。这种方式适用于需要与传统Servlet容器集成的场景。
41 8
|
2月前
|
XML Java 应用服务中间件
Spring Boot 两种部署到服务器的方式
本文介绍了Spring Boot项目的两种部署方式:jar包和war包。Jar包方式使用内置Tomcat,只需配置JDK 1.8及以上环境,通过`nohup java -jar`命令后台运行,并开放服务器端口即可访问。War包则需将项目打包后放入外部Tomcat的webapps目录,修改启动类继承`SpringBootServletInitializer`并调整pom.xml中的打包类型为war,最后启动Tomcat访问应用。两者各有优劣,jar包更简单便捷,而war包适合传统部署场景。需要注意的是,war包部署时,内置Tomcat的端口配置不会生效。
507 17
Spring Boot 两种部署到服务器的方式
|
2月前
|
Dart 前端开发 JavaScript
springboot自动配置原理
Spring Boot 自动配置原理:通过 `@EnableAutoConfiguration` 开启自动配置,扫描 `META-INF/spring.factories` 下的配置类,省去手动编写配置文件。使用 `@ConditionalXXX` 注解判断配置类是否生效,导入对应的 starter 后自动配置生效。通过 `@EnableConfigurationProperties` 加载配置属性,默认值与配置文件中的值结合使用。总结来说,Spring Boot 通过这些机制简化了开发配置流程,提升了开发效率。
87 17
springboot自动配置原理
|
2月前
|
XML JavaScript Java
SpringBoot集成Shiro权限+Jwt认证
本文主要描述如何快速基于SpringBoot 2.5.X版本集成Shiro+JWT框架,让大家快速实现无状态登陆和接口权限认证主体框架,具体业务细节未实现,大家按照实际项目补充。
132 11
|
2月前
|
缓存 安全 Java
Spring Boot 3 集成 Spring Security + JWT
本文详细介绍了如何使用Spring Boot 3和Spring Security集成JWT,实现前后端分离的安全认证概述了从入门到引入数据库,再到使用JWT的完整流程。列举了项目中用到的关键依赖,如MyBatis-Plus、Hutool等。简要提及了系统配置表、部门表、字典表等表结构。使用Hutool-jwt工具类进行JWT校验。配置忽略路径、禁用CSRF、添加JWT校验过滤器等。实现登录接口,返回token等信息。
685 12