spring MVC
定义
spring MVC 是 Spring 框架内部的 Web 层模块,官方正式名称是 Spring Web MVC,名称取自它所在的源码模块 spring-webmvc[1]。它建立在 Servlet API 之上,属于请求驱动型的 MVC 框架:每个进入容器的 HTTP 请求都要经过一个中心 Servlet 统一调度[1]。
与只提供单一控制器基类的框架不同,spring MVC 为请求映射、控制器执行、视图解析、数据绑定、本地化等职责各定义了策略接口,开发者可以替换其中任意一环的实现[4]。官方文档也说明,spring MVC 与 Spring 框架 5.0 引入的响应式框架 Spring WebFlux 并列存在,后者名称同样来自其源码模块 spring-webflux[1]。
原理
框架的流程控制中心是 DispatcherServlet,它是真正继承自 HttpServlet 的类,被称作前端控制器,负责拦截客户端请求并按规则转交给其他组件,从而降低各组件之间的耦合[2]。请求到达后,它先由处理器映射(HandlerMapping)定位处理对象,再通过处理器适配(HandlerAdapter)调用控制器,控制器产出的模型数据交给视图解析器(ViewResolver)选出视图并渲染,最后把响应写回客户端[4]。
在这一过程中,模型数据以键值对形式存放在 Map 中,视图名与具体视图技术之间保持解耦,因而同一份模型可以交给 JSP、模板引擎或其他渲染方式[4]。DispatcherServlet 在部署时可以在 web.xml 中配置,若未指定初始化参数,容器会到 WEB-INF 目录下按“Servlet 名称-servlet.xml”的命名规则寻找默认配置文件[2]。
由于 Web 层由 Spring 容器负责装配,控制器可以直接获得依赖注入的能力,业务对象无需为适配框架而继承特定基类[4]。这种非侵入的设计也使得框架自身接口在测试中较容易用替身实现[4]。
发展历程
spring MVC 的底层依托 Spring 框架,而 Spring 最早的组件由 Rod Johnson 在 2000 年为伦敦金融业客户做独立咨询时编写,随后在其著作中公开,并于 2003 年 2 月在 SourceForge 上建立开源项目[5]。2004 年 3 月,Spring 发布 1.0 版本,该版本即已包含 MVC Web 框架功能[6]。
按官方博客的记述,Spring 2.5 于 2007 年引入了注解式控制器,用 @Controller 与 @RequestMapping 表达处理器类及其请求映射,取代了此前必须实现 Controller 接口或继承 MultiActionController 的写法[7]。Spring 3.0 则把表述性状态转移(REST)风格纳入框架,引入 URI 模板与 @PathVariable、内容协商、HTTP 方法转换等能力,使同一份模型可以按客户端要求输出不同表现形式[8]。
Spring 3.1 起增加了 @EnableWebMvc 等基于 Java 类的配置方式,并以 RequestMappingHandlerMapping 与 RequestMappingHandlerAdapter 取代 2.5 时代的注解映射与适配组件[9]。此后框架随 Spring 主线迭代:6.0 版要求 Java 17 以上并迁移到 Jakarta EE 9 的命名空间[10];7.0 版于 2025 年 11 月正式发布,Web 层基线提升到 Servlet 6.1,并弃用了 spring MVC 的 XML 配置命名空间,转而推荐 Java 配置[11]。
应用
spring MVC 的主要用途是构建 Java 服务端 Web 应用,既包括返回页面的传统站点,也包括以 JSON 或 XML 为载体的 RESTful 接口[4]。借助 @RequestBody 与 @ResponseBody 配合消息转换器,控制器可以直接收发结构化数据;借助内容协商,同一资源可以按请求头或扩展名返回 HTML、XML、JSON 等不同形式[9]。
框架还提供拦截器、数据校验、格式化绑定、国际化与主题解析等 Web 层通用能力,LocaleResolver 可基于 Cookie、Session 或请求头解析区域设置[12]。韩国的电子政务标准框架即以其注解式请求映射作为界面层与控制器的对接方式[12]。在工程实践中,它常与持久层框架组合使用,形成所谓 SSM 组合[13]。
搭建 Spring Boot 项目时勾选的 Web 依赖,实际引入的正是 spring MVC,并以 Apache Tomcat 作为默认的内嵌容器[14]。Spring Boot 的 MVC 自动配置也建立在 spring MVC 的 Java 配置之上,并在其基础上追加了若干便利选项[3]。
局限
spring MVC 沿用 Servlet API 的阻塞式输入输出模型,默认采用每个请求占用一个线程的方式,请求在等待远程调用或数据库返回期间会一直占住线程,线程池耗尽后新请求只能排队或被拒绝[15]。Servlet 3.0 之后虽支持异步请求处理,能在容器线程与业务线程之间建立异步边界,但读写仍要回到容器线程以阻塞方式完成,异步并不贯穿整条链路[16]。
因此在高并发、长连接或流式推送场景下,spring MVC 的伸缩性不如基于事件循环的非阻塞模型[15]。它与 Servlet API 的紧密耦合也被部分评论者视为缺少更高层 Web 抽象的表现,尽管这种耦合同时保证了 Servlet 规范的能力对开发者始终可用[4]。
此外,框架早期依赖的 XML 配置在 7.0 版中已被标记为弃用,不再跟随 Java 配置模型演进,存量项目需要面对迁移成本[11]。7.0 版同时移除了后缀模式匹配、尾部斜杠匹配及基于路径扩展名的内容协商等旧选项,升级时需相应调整映射与协商配置[11]。
版本与运行环境也构成约束:6.0 起要求 Java 17 以上并采用 jakarta 命名空间,7.0 起要求部署在较新的 Servlet 容器上,如 Tomcat 11 及 Jetty 12.1 以上[11]。同时期公布的维护安排显示,6.2 分支的开源支持将于 2026 年 6 月结束[17]。
参见
-
Spring WebFlux —— Spring 5.0 引入的响应式 Web 框架,与 spring MVC 并列,采用非阻塞模型。
-
Servlet —— spring MVC 运行所依托的 Java Web 组件规范。
-
Spring Boot —— 基于 Spring 的快速开发框架,其 Web 能力来自 spring MVC。
-
MVC —— spring MVC 所实现的分层设计模式。
-
控制反转 —— Spring 容器的核心机制,为控制器提供依赖注入。
-
REST —— spring MVC 自 3.0 起支持的接口设计风格。
参考资料
- Spring Web MVC [引用日期2026-10-29]
- 第11章-SpringMVC的核心类和注解(PDF) [引用日期2026-10-29]
- Web MVC Config [引用日期2026-10-29]
- Spring Framework [引用日期2026-10-29]
- SPRING框架——由来和发展 [引用日期2026-10-29]
- 1-spring-history [引用日期2026-10-29]
- Spring 2.5 中的注解式 Web MVC 控制器 [引用日期2026-10-29]
- Spring 3 中的 REST:@MVC [引用日期2026-10-29]
- title: Spring MVC-01-各版本新特性 [引用日期2026-10-29]
- 作者 | Juergen Hoeller [引用日期2026-10-29]
- Spring Framework 7.0 Release Notes - Skip to content [引用日期2026-10-29]
- 화면처리 | 표준프레임워크 개발가이드 [引用日期2026-10-29]
- cppinfo.cn 上的网页 [引用日期2026-10-29]
- 【Spring】Spring MVC的项目准备和连接建立 [引用日期2026-10-29]
- guvi.in 上的网页 [引用日期2026-10-29]
- stackoverflow.com 上的网页 [引用日期2026-10-29]
- Spring Framework Versions [引用日期2026-10-29]