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

目录
相关文章
|
16天前
|
监控 Java 应用服务中间件
Spring Boot整合Tomcat底层源码分析
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置和起步依赖等特性,大大简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是其与Tomcat的整合。
42 1
|
1月前
|
前端开发 Java Spring
Spring MVC源码分析之DispatcherServlet#getHandlerAdapter方法
`DispatcherServlet`的 `getHandlerAdapter`方法是Spring MVC处理请求的核心部分之一。它通过遍历预定义的 `HandlerAdapter`列表,找到适用于当前处理器的适配器,并调用适配器执行具体的处理逻辑。理解这个方法有助于深入了解Spring MVC的工作机制和扩展点。
23 0
|
4月前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
50 0
|
7月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
195 0
|
7月前
|
开发框架 前端开发 JavaScript
JavaScript云LIS系统源码ASP.NET CORE 3.1 MVC + SQLserver + Redis医院实验室信息系统源码 医院云LIS系统源码
实验室信息系统(Laboratory Information System,缩写LIS)是一类用来处理实验室过程信息的软件,云LIS系统围绕临床,云LIS系统将与云HIS系统建立起高度的业务整合,以体现“以病人为中心”的设计理念,优化就诊流程,方便患者就医。
82 0
|
存储 开发框架 前端开发
[回馈]ASP.NET Core MVC开发实战之商城系统(五)
经过一段时间的准备,新的一期【ASP.NET Core MVC开发实战之商城系统】已经开始,在之前的文章中,讲解了商城系统的整体功能设计,页面布局设计,环境搭建,系统配置,及首页【商品类型,banner条,友情链接,降价促销,新品爆款】,商品列表页面,商品详情等功能的开发,今天继续讲解购物车功能开发,仅供学习分享使用,如有不足之处,还请指正。
170 0
|
开发框架 前端开发 .NET
[回馈]ASP.NET Core MVC开发实战之商城系统(三)
[回馈]ASP.NET Core MVC开发实战之商城系统(三)
107 0
|
开发框架 前端开发 .NET
[回馈]ASP.NET Core MVC开发实战之商城系统(一)
[回馈]ASP.NET Core MVC开发实战之商城系统(一)
179 0
|
SQL 开发框架 前端开发
[回馈]ASP.NET Core MVC开发实战之商城系统(开篇)
[回馈]ASP.NET Core MVC开发实战之商城系统(开篇)
222 0
|
开发框架 缓存 JSON
ASP.NET Core MVC 从入门到精通之Filter
ASP.NET Core MVC 从入门到精通之Filter
184 0