Spring MVC源码-核心架构与请求处理流程

MVC是我们学习Spring架构绕不过去的一块内容,并且在日常开发生活中早已成为了一种规范,所谓的MVC就是 Model-View-Controller:模块-视图-控制器,是将业务逻辑、用户界面和数据模型 分开,是专门应用于开发Web应用程序。通过DispatcherServelt前端控制器,MVC管理传进来的HTTP请求,并将请求派发给相应的控制器进行处理。

1. 核心架构

图片来源于:pdai.tech/md/spring/s...

我们可以看到,Spring MVC的核心架构以DispatcherServelt为中心,DispatcherServelt是整个架构的入口点,负责接收并分发HTTP的请求。我们可以看到这些有这些组件:

  • DispatcherServelt:前端控制器,接受请求、分发请求
  • HandlerMapping:将请求映射到具体的控制器
  • HandlerAdapter:适配器,用于调用控制器方法,支持不同类型的控制器
  • ViewResolver:将逻辑视图名解析为实际的视图对象
  • View:渲染模型数据,生成最终响应,如HTML或者JSON
  • Controller:处理请求的业务逻辑,这也是我们在写接口的时候最直接接触的

2. 请求处理流程

MVC的请求处理流程是理解其工作原理的关键,我们先整体看一下整个请求流程是什么:

  • 客户端发送请求:用户通过浏览器发送HTTP请求,指定特定的URL
  • DispatcherServlet:前端控制器拦截所有传入的请求
  • HandlerMapping映射请求 :DispatcherServlet使用HandlerMapping确定哪个控制器处理该请求,根据URL和HTTP方法(GET、POST)找到匹配的控制器方法
  • HandlerAdapter调用控制器 :找到控制器后,HandlerAdapter执行控制器方法,处理业务逻辑,可能调用服务层或数据访问层,并返回视图名
  • ViewResolver解析视图 :返回的视图名,DispatcherServlet使用ViewResolver将逻辑视图名解析为实际视图
  • 视图渲染:视图使用模型数据渲染生成了最终响应内容
  • 返回响应 :DispatcherServlet将渲染后的视图作为HTTP响应返回给客户端

客户端 -> HTTP 请求 -> DispatcherServlet -> HandlerMapping -> Controller -> 业务逻辑 -> ModelAndView -> ViewResolver -> View -> 渲染 -> HTTP 响应 -> 客户端

2.1 请求处理流程核心源码解析

整个的源码很多,我这里不全部贴出来,只放出来重要的部分

在这个doDispatch方法里把处理器、处理器适配器、执行处理器方法等一系列流程都在这个方法里。比如:

  • getHandler(): 调用 HandlerMapping 的 getHandler() 方法,通过请求 URL 匹配到对应的 HandlerMethod(如 @RequestMapping 注解的方法)。
  • getHandlerAdapter() :遍历所有 HandlerAdapter,找到支持当前 Handler 的适配器(如 RequestMappingHandlerAdapter 处理 @Controller)。
  • Handler执行 :HandlerAdapter 的 handle() 方法通过反射执行处理器方法,期间完成参数解析(HandlerMethodArgumentResolver)和返回值处理(HandlerMethodReturnValueHandler)。
  • 视图渲染: 在 processDispatchResult() 中调用 ViewResolver 解析视图名称,最终由 View 的 render() 方法生成响应内容。

2.2 源码的扩展点

如果我们想去自定义实现一些需求,那我们就要了解整个请求处理流程的关键扩展点,那我们来看一下我们经常会用的几个扩展点:

2.2.1 HandlerMapping(处理器映射器)

常见的实现有:RequestMappingHandlerMapping(处理 @RequestMapping 注解),或者你可以自定义一个HandMapping,比如基于某种规则动态分发(比如根据请求头、请求体动态匹配)

typescript 复制代码
public class MyHandlerMapping implements HandlerMapping {
    @Override
    public HandlerExecutionChain getHandler(HttpServletRequest request) {
        // 自定义根据请求URI返回Handler
    }
}

2.2.2 HandlerAdapter(处理器适配器)

常见的实现:RequestMappingHandlerAdapter(处理基于注解的Controller),或者你自定义HandlerAdapter可以用来支持你想来支持的

2.2.3 HandlerMethodArgumentResolver(方法参数解析器)

常见的实现:我们这个知道在调用Controller方法时,负责解析方法参数,比如@RequestParam、@PathVariable。那常见的实现有**RequestParamMethodArgumentResolver**

我们可以通过此扩展点可以自己定义新的注解

另外还有返回值处理器、视图解析器、异常处理器这些都可以进行自定义扩展实现。这里就是策略模式的优点,可以在任何节点定制自己的逻辑。

3. 总结

这节的重点是,Spring MVC 的核心架构以 DispatcherServlet 为中心,通过 HandlerMapping、HandlerAdapter、ViewResolver 等组件协同工作,实现了请求的分发、处理和响应的完整流程。

相关推荐
程序猿乐锅13 分钟前
万字详解Single-flight(单飞模式)
java·开发语言·分布式·后端·学习·single-flight
Java后端的Ai之路25 分钟前
【AIAgent开发】-Agent工具封装成CLI(纯干货!!!)
java·javascript·人工智能·agent·cli
AntsData1 小时前
用 12K+ 条亚马逊评论信号,定位机械键盘下一版该改什么
java·大数据·计算机外设
code2cat1 小时前
【随笔】连续批处理:长短请求怎样在迭代之间补位
java·人工智能·后端·大语言模型·vllm
最强小杰1 小时前
DeepSeek V4 Flash + Codex CLI 接入教程:原生 Responses API 适配,从配置到跑通收藏这篇就够了(2026)
java·前端·python·ai
考研保研资料分享1 小时前
2022环境工程保研北师大:三校专业追问、论文贡献与择校复盘
面试
Flynn Liang1 小时前
Spring AI 2.0 深度解析:ChatClient、Advisor 链与 MCP——Java 工程师的 AI 落地最优解
java·人工智能·spring·大模型·架构设计·spring ai
灿飞1 小时前
Kotlin与Java虚拟机六:基础与类型系统:一切皆对象,但对象有代价
java·kotlin
计算机毕设定制辅导-无忧学长2 小时前
《基于微信小程序健康习惯激励系统设计与实现》
java·spring boot·mysql·微信小程序·uniapp·健康习惯激励系统
雪芽蓝域zzs2 小时前
第 1 章:IDEA 创建 SpringBoot3.5.16 Maven 项目
java·maven·intellij-idea