xancel的自留地
文章
技术

Spring MVC,我是怎么理解的

2026年3月24日 5 分钟阅读 浏览 0 喜欢 0 评论 0
AI 摘要

本文系统梳理了Spring MVC的核心概念与执行流程。Spring MVC是基于Servlet规范的Web框架,其核心是DispatcherServlet,它作为统一入口协调HandlerMapping、HandlerAdapter等组件完成请求处理。文章详细解释了从请求接收到响应的完整流转过程,并区分了传统页面渲染与前后端分离两种场景下的不同处理机制。

我一直感觉SpringMVC的执行过程有些抽象,有些概念有点绕,于是我想着先把很多概念了解清楚,最后再把流程给捋清楚,尝试之后对我的理解还是很有效的,这篇文章经过我的整理输出后由AI润色和修正了格式等内容

1. 什么是 Spring MVC

Spring MVC 是 Spring 体系中的 Web MVC 框架,用来帮助我们基于 Servlet 快速开发 Web 应用。

这里的 MVC 指的是:

  • Model:模型数据,或者说业务数据
  • View:视图,负责展示页面
  • Controller:控制器,负责接收请求、组织调用、返回结果

它的核心思想是把请求接入、参数处理、业务调用、结果响应这些职责拆开,让代码结构更清晰。

需要注意一点:Controller 负责的是请求入口和流程协调,真正的业务逻辑通常应该放在 Service 层,而不是全部堆在 Controller 里。

2. 什么是 Servlet

Servlet 本质上是 Java Web 的一套规范,用来定义服务器如何接收 HTTP 请求、如何处理请求、如何返回 HTTP 响应。

像 Tomcat、Jetty 这样的 Web 容器会实现这套规范,并负责:

  • 加载 Servlet
  • 管理 Servlet 生命周期
  • 在请求到来时调用对应的 Servlet

可以把它理解成:Servlet 提供了 Java Web 最基础的请求处理能力,而 Spring MVC 是构建在这套能力之上的更高层封装。

3. Spring MVC 和 Servlet 是什么关系

Spring MVC 是建立在 Servlet 规范之上的。

它的核心入口是 DispatcherServletDispatcherServlet 本身就是一个 Servlet,所以它可以像普通 Servlet 一样被 Web 容器加载和调用。

也就是说:

  • Web 容器负责把请求交给 DispatcherServlet
  • DispatcherServlet 负责在 Spring MVC 内部完成后续流程

后续这些流程包括:

  • 路由分发
  • 查找处理器
  • 参数绑定
  • 调用控制器方法
  • 处理返回值
  • 视图解析或响应体输出

4. Spring MVC 的几个核心组件

4.1 DispatcherServlet 是什么

DispatcherServlet 是 Spring MVC 的核心调度器,也是整个请求处理流程的统一入口。

浏览器发来的请求,通常会先到它这里,再由它决定后续交给谁处理。

它的职责可以概括为:

  • 接收请求
  • 分发请求
  • 协调各个组件一起工作
  • 最终生成响应

4.2 HandlerMapping 是什么

HandlerMapping 可以理解成“请求路径到处理器的映射表”。

当请求到来时,它会根据请求信息去找到对应的处理器。匹配条件通常包括:

  • URL
  • HTTP 请求方法
  • 其他请求条件

在注解驱动开发里,Spring 启动时会解析诸如 @RequestMapping@GetMapping@PostMapping 这类映射信息,并建立对应关系。

4.3 Controller 和处理器是什么关系

在日常开发里,我们会写很多 @Controller@RestController 类。

对于注解驱动的 Spring MVC 来说,真正执行请求处理逻辑的,通常是 Controller 中某一个具体的方法。这个方法通常就可以理解为当前请求对应的处理器。

也就是说:

  • Controller 是处理请求的载体
  • 具体的处理器,通常是其中某个带映射注解的方法

所以 HandlerMapping 最终定位到的,通常不是整个类,而是类中的某个方法。

4.4 HandlerAdapter 是什么

HandlerAdapter 可以理解成“处理器执行适配器”。

DispatcherServlet 找到处理器之后,并不是自己直接用反射去调用,而是交给合适的 HandlerAdapter 来执行。

它主要负责:

  • 参数解析与绑定
  • 类型转换
  • 调用目标方法
  • 处理方法返回值

在基于注解的 Spring MVC 中,最常见的是 RequestMappingHandlerAdapter

4.5 ViewResolver 是什么

ViewResolver 是视图解析器。

当控制器返回的是一个“视图名”时,Spring MVC 会通过 ViewResolver 把这个名字解析成真正的视图对象,比如 JSP 或 Thymeleaf 模板。

4.6 HttpMessageConverter 是什么

HttpMessageConverter 是消息转换器。

当前后端分离接口返回的是对象、JSON、XML 等响应体数据时,Spring MVC 会通过它把 Java 对象转换成 HTTP 响应内容。

最常见的场景就是把 Java 对象转换为 JSON。

5. Controller 执行完之后,会返回什么

这部分要分成两种场景来看。

5.1 传统服务端页面渲染

如果是传统 Web 项目,控制器方法通常可能返回:

  • 视图名,比如 "userList"
  • ModelAndView

这时 Spring MVC 的处理思路是:

  1. 控制器方法执行完成
  2. 得到视图相关结果
  3. 交给 ViewResolver 解析视图
  4. 由视图技术渲染页面
  5. 最终把 HTML 返回给浏览器

5.2 前后端分离接口返回

如果是前后端分离项目,控制器方法通常返回:

  • 一个普通对象
  • ResponseEntity
  • 标注了 @ResponseBody 的返回结果

如果类上使用了 @RestController,本质上也等价于默认带有 @ResponseBody 语义。

这时流程就不是“返回视图”,而是“直接返回数据”。

更准确地说,这类返回值会由 Spring MVC 的返回值处理机制配合 HttpMessageConverter 写入响应体,而不是再走视图解析。

所以这里不要简单理解成“HandlerAdapter 返回了 null”,更准确的理解应该是:

  • 控制器方法返回的是数据
  • Spring MVC 把这些数据写进 HTTP 响应体
  • DispatcherServlet 不再进行视图渲染

6. 一次请求在 Spring MVC 中是怎么流转的

把前面的内容串起来,一次典型请求大致会经过下面这些步骤。

  1. 浏览器发起 HTTP 请求。
  2. Web 容器接收到请求后,把请求交给 DispatcherServlet
  3. DispatcherServlet 调用 HandlerMapping 查找当前请求对应的处理器。
  4. 找到处理器后,DispatcherServlet 再交给合适的 HandlerAdapter 去执行。
  5. HandlerAdapter 完成参数绑定、类型转换,然后调用目标控制器方法。
  6. 控制器方法执行业务流程,并返回结果。
  7. 如果返回的是视图名或 ModelAndView,则进入视图解析和页面渲染流程。
  8. 如果返回的是对象或 ResponseEntity,则通过 HttpMessageConverter 直接写入响应体。
  9. 最终响应返回给客户端。

为了先把主线讲清楚,这里暂时没有展开拦截器、异常处理器、文件上传解析器这些扩展机制,但它们本质上也都是围绕这条主流程工作的。

7. 几个容易混淆的点

7.1 Controller 不等于业务逻辑

Controller 的主要职责是接收请求、做参数承接、组织调用和返回结果。

真正的业务逻辑通常应该放在 Service 层。这样分层才清晰,也更容易维护。

7.2 DispatcherServlet 不是“一个类包办一切”

虽然 DispatcherServlet 是统一入口,但它并不是自己完成所有工作。

它更像一个总调度器,会把不同阶段的工作分别交给:

  • HandlerMapping
  • HandlerAdapter
  • ViewResolver
  • HttpMessageConverter

7.3 前后端分离场景下,通常不会再走视图解析

如果控制器返回的是 JSON 数据,那么重点就不再是 ViewResolver,而是返回值处理机制和 HttpMessageConverter

也就是说,前后端分离项目和传统服务端页面渲染项目,后半段流程是不一样的。

喜欢 0
评论区在赶来的路上...