Spring MVC 核心原理解析:从请求到响应到底发生了什么?

目录

[一、什么是 Spring MVC?它解决了什么问题?](#一、什么是 Spring MVC?它解决了什么问题?)

[二、Spring MVC 中的 MVC 是什么?](#二、Spring MVC 中的 MVC 是什么?)

[三、Spring MVC 的整体架构](#三、Spring MVC 的整体架构)

四、一次完整请求的执行流程

[1. 请求进入 DispatcherServlet](#1. 请求进入 DispatcherServlet)

[2. HandlerMapping 查找处理器](#2. HandlerMapping 查找处理器)

[3. HandlerAdapter 执行处理器](#3. HandlerAdapter 执行处理器)

[4. Controller 执行业务逻辑](#4. Controller 执行业务逻辑)

[5. 返回结果处理](#5. 返回结果处理)

[6. 响应客户端](#6. 响应客户端)

[五、Spring MVC 中常见的核心能力](#五、Spring MVC 中常见的核心能力)

[1. 请求映射](#1. 请求映射)

[2. 参数解析与绑定](#2. 参数解析与绑定)

[3. 数据返回与序列化](#3. 数据返回与序列化)

[4. 异常处理](#4. 异常处理)

[六、Spring MVC 与 Spring 的关系](#六、Spring MVC 与 Spring 的关系)

[七、Spring MVC 与 Spring Boot 的关系](#七、Spring MVC 与 Spring Boot 的关系)

[八、Spring MVC 的设计思想总结](#八、Spring MVC 的设计思想总结)

九、总结


一、什么是 Spring MVC?它解决了什么问题?

Spring MVC 是 Spring 提供的一个 基于 MVC 模式的 Web 框架,用于构建 Web 应用和 REST 接口。

在没有 Spring MVC 之前,传统 Servlet 开发存在明显问题:

  • 一个 Servlet 处理大量逻辑
  • 请求分发、参数解析、业务处理耦合严重
  • 可维护性差、扩展成本高

**Spring MVC 的目标:**将 Web 请求处理过程进行职责拆分,让每一部分只做一件事。

二、Spring MVC 中的 MVC 是什么?

Spring MVC 遵循经典的 MVC(Model-View-Controller) 模式:

  • Model:业务数据和业务逻辑
  • View:页面展示(JSP、Thymeleaf、JSON 等)
  • Controller:请求处理与调度

在前后端分离项目中:

  • View 往往退化为 JSON
  • Controller 的职责更加清晰

三、Spring MVC 的整体架构

Spring MVC 的核心架构围绕一个组件展开:DispatcherServlet(前端控制器)

所有请求都会先到 DispatcherServlet,然后再由它统一调度。

核心组件包括:

  • DispatcherServlet:统一入口
  • HandlerMapping:找到处理请求的方法
  • HandlerAdapter:执行目标方法
  • Handler(Controller):具体业务处理
  • ViewResolver:视图解析
  • View:结果渲染

Spring MVC 是一个"强中心调度"的框架。

四、一次完整请求的执行流程

下面是一次 HTTP 请求在 Spring MVC 中的完整流程。

用户发起请求后,请求首先进入前端控制器 DispatcherServlet。DispatcherServlet 根据请求的 URL 信息通过处理器映射器 HandlerMapping 查找对应的处理器,并封装成一个处理器执行链 HandlerExecutionChain。随后,DispatcherServlet 将处理器交由处理器适配器 HandlerAdapter 执行,HandlerAdapter 负责完成参数解析并调用具体的 Controller 方法。Controller 处理业务逻辑后返回 ModelAndView,DispatcherServlet 再将其交给 ViewResolver 解析出具体的 View,并将 Model 数据渲染到视图中,最终由 DispatcherServlet 将渲染结果响应给客户端。

1. 请求进入 DispatcherServlet

  • 所有请求首先到达 DispatcherServlet
  • 相当于 Web 层的"总控中心"

2. HandlerMapping 查找处理器

  • 根据 URL、请求方式
  • 找到对应的 Controller 方法
java 复制代码
@GetMapping("/users/{id}")
public User getUser(@PathVariable Long id) { }

3. HandlerAdapter 执行处理器

  • 负责调用 Controller 方法
  • 同时完成:
    • 参数解析
    • 参数绑定
    • 类型转换

你平时写的各种传参,本质都发生在这一步。

4. Controller 执行业务逻辑

  • 调用 Service
  • 返回结果(ModelAndView 或数据)

5. 返回结果处理

根据返回值类型不同:

  • 返回视图名 → ViewResolver 解析
  • 返回对象 → HttpMessageConverter 转换为 JSON

6. 响应客户端

  • 数据或页面写入 HTTP 响应
  • 请求结束

五、Spring MVC 中常见的核心能力

1. 请求映射

java 复制代码
@RequestMapping
@GetMapping
@PostMapping

完成 URL → 方法 的映射。

2. 参数解析与绑定

  • 路径参数
  • 请求参数
  • 请求体参数
  • 对象参数

本质是 请求数据 → Java 方法参数 的映射。

3. 数据返回与序列化

java 复制代码
@ResponseBody
@RestController
  • 返回 JSON
  • 依赖 HttpMessageConverter
  • 默认使用 Jackson

4. 异常处理

java 复制代码
@ExceptionHandler
@ControllerAdvice
  • 统一异常处理
  • 解耦业务逻辑与异常逻辑

六、Spring MVC 与 Spring 的关系

一个非常容易混淆的问题是:Spring MVC 和 Spring 是什么关系?

  • Spring:核心容器(IoC + AOP)
  • Spring MVC:运行在 Spring 之上的 Web 框架

Spring MVC 强依赖 Spring 的 IoC 容器。

Controller、Service、组件管理,全部交给 Spring。

七、Spring MVC 与 Spring Boot 的关系

Spring Boot 并没有改变 Spring MVC 的核心原理,而是:

  • 自动注册 DispatcherServlet
  • 自动配置 HandlerMapping、MessageConverter
  • 减少 XML 和样板代码

用不用 Spring Boot,Spring MVC 的执行流程完全一致。

八、Spring MVC 的设计思想总结

Spring MVC 的核心设计思想可以总结为三点:

  1. 前端控制器统一调度
  2. 职责拆分,组件协作
  3. 高度可扩展的架构设计

这也是它能够长期成为 Java Web 主流方案的原因。

九、总结

Spring MVC 是一个以 DispatcherServlet 为核心,通过组件协作完成 Web 请求处理的框架。

相关推荐
ly768911 小时前
生产环境 Spring Boot 应用内存泄漏排查实战
java·spring boot·spring·内存泄漏·threadlocal·gc日志·堆转储
IT小白杨11 小时前
eBay多账号如何应对关联判定:主体、收款、IP、环境四层配置清单一次讲清
java·网络·网络协议·tcp/ip·自动化·指纹浏览器
無a伟12 小时前
RabbitMq高级特性:TTL,死信队列,延迟队列
java·分布式·rabbitmq
长谷深风11112 小时前
Agent 跑了 30 分钟宕机,如何从断点继续?
java·大数据·人工智能·ai·大模型·memory·aiagent
慧都小妮子12 小时前
DevExpress Java 文档处理 API 免费 CTP:PDF、PowerPoint、条码与跨平台部署
java·pdf·powerpoint·devexpress·文档处理·条码生成
泡海椒12 小时前
告别反射低效:JQuick-Java ASM动态调用链性能优化实战
java·python·性能优化
土司大王12 小时前
LeetCode 17 电话号码的字母组合:Java 回溯模板、多叉决策树与复杂度分析
java·leetcode·决策树
CoderYanger13 小时前
前端基础——JavaScript(WebAPI)代码案例
java·开发语言·前端·javascript·css·前端框架·html5
Nuanyt13 小时前
JUC常见核心知识梳理02 AQS ReentrantLock CAS 原子类 线程池
java
CodeStats13 小时前
【Java数据类型】Java底层数据类型原理(上):基本类型、转换与封装核心
java·数据类型·string·封装·转换