Spring、Spring MVC 和 Spring Boot 有什么区别?
简化版
Spring Framework 提供 IoC、AOP、事务等基础能力,Spring MVC 是其中用于 Servlet Web 开发的模块;Spring Boot 建立在 Spring 之上,通过自动配置、Starter、内嵌服务器和运维支持降低应用搭建与部署成本。Spring Boot 没有替代 Spring,而是让 Spring 应用更快形成可运行、可配置、可监控的工程。
详细版
Spring Framework 是底座,既包含核心容器,也包含数据访问、事务、Web MVC 等模块。Spring MVC 解决 HTTP 请求映射、参数绑定、Controller 调用、消息转换和视图渲染;它可以脱离 Spring Boot 使用,只是需要开发者自行完成更多配置和部署工作。
Spring Boot 的重点是工程化约定:Starter 聚合依赖,自动配置按环境注册常用 Bean,SpringApplication 统一启动流程,Servlet 应用可直接运行内嵌服务器,Actuator 提供健康检查和指标端点。业务代码最终仍在使用 Spring Framework 的 Bean、事务和 MVC 等能力。
完整版教学
一、Spring Framework 是能力底座
Spring Framework 的核心价值是管理对象与依赖,并提供一致的扩展模型。常见能力包括:
- IoC 容器与依赖注入;
- AOP 和声明式事务;
- JDBC、ORM 与事务抽象;
- Spring MVC、WebSocket 等 Web 能力;
- 事件、资源、校验与测试支持。
不用 Spring Boot 也能创建 Spring 应用,只是需要自己选择依赖版本、注册配置、准备服务器和部署结构。
二、Spring MVC 只负责 Web MVC
Spring MVC 围绕 DispatcherServlet 工作,将请求映射到 Controller,再完成参数解析、返回值处理和异常处理。它是 Spring Framework 的一个 Web 模块,不负责整个应用的依赖版本管理,也不等于 Spring Boot。
@RestController
class HelloController {
@GetMapping("/hello")
String hello() {
return "hello";
}
}
这段 Controller API 来自 Spring MVC;它之所以在 Boot 项目中几乎不用额外配置就能运行,是 Boot 自动准备了 MVC 基础设施和服务器。
三、Spring Boot 做了哪些工程化工作
Spring Boot 根据类路径、配置属性和已有 Bean 推断合理默认值。例如引入 Web Starter 后,Servlet API、Spring MVC、JSON 支持和默认内嵌服务器相关依赖被统一带入,匹配的自动配置再注册所需组件。
它还统一了外部化配置、日志初始化、应用事件、可执行归档、测试切片与 Actuator。开发者仍可以定义自己的 Bean 或属性覆盖默认行为,并没有失去 Spring 原有的可扩展性。
四、自动配置不等于代码生成
Boot 并不会改写 Controller 或 Service 的业务代码。自动配置本质上仍是带条件的 Java 配置类,根据环境向 Spring 容器注册 Bean;条件不满足或用户已经提供替代 Bean 时,相应默认配置会跳过。
因此排查问题时可以回到普通 Spring 心智模型:容器里有哪些 Bean、它们由哪个配置类注册、条件为什么匹配、属性最终取了什么值。
五、应该如何选择
现代独立 Spring 应用通常直接以 Spring Boot 为工程入口,再按需使用 MVC、Data、Security 等模块。只有受既有容器、特殊部署规范或极简依赖控制约束时,才可能直接组合 Spring Framework。
“使用 Boot”与“理解 Spring”并不矛盾。Boot 减少的是重复配置,IoC、Bean 生命周期、AOP、事务等底层机制仍然决定运行行为。
六、用分层表避免概念混用
一个 Boot Web 项目可能只有 1 个 main 方法,却同时使用三层能力:Spring 容器管理 OrderService 和事务,Spring MVC 处理 /orders 请求,Spring Boot 负责启动、自动配置服务器与暴露 Actuator。删掉 Boot 并不意味着 Controller API 消失,但开发者必须自行补齐上下文、MVC 基础设施、服务器与部署配置。
| 维度 | Spring Framework | Spring MVC | Spring Boot |
|---|---|---|---|
| 定位 | 基础框架与模块集合 | Servlet Web MVC 模块 | Spring 应用工程化与约定层 |
| 核心对象 | BeanFactory/ApplicationContext | DispatcherServlet | SpringApplication、自动配置 |
| 解决问题 | IoC、AOP、事务、数据访问等 | 请求映射、参数与返回值处理 | 依赖组合、默认装配、启动部署、运维 |
| 能否独立使用 | 可以 | 可在非 Boot Spring 应用使用 | 建立在 Spring Framework 上 |
| 是否等于业务框架 | 否,提供基础能力 | 只聚焦 Web MVC | 不替代业务设计 |
Spring Boot(启动、约定、自动配置、Actuator)
↓ 组织和配置
Spring Framework(IoC、AOP、事务、各模块)
└── Spring MVC(Servlet Web 模块)
Boot 的“用户配置优先”也不是魔法覆盖。它常通过条件默认 Bean 退让,某些能力则需要属性、Customizer 或明确排除自动配置;最终仍应回到 Spring 容器检查 BeanDefinition 与条件报告。
记忆钩子:Spring 是地基,MVC 是地基上的 Web 房间,Boot 是把材料、默认施工方案和启动运维流程组织起来的工程体系。
七、常见误区与追问
- 误区:Spring Boot 是 Spring Framework 的替代品。 Boot 建立在 Spring 上,业务 Bean、AOP、事务和 MVC 最终仍由 Framework 能力实现。
- 误区:Spring MVC 和 Spring Boot 都是完整应用框架,因此二选一。 MVC 是 Web 模块,Boot 可以自动配置 MVC,也可以配置非 Web 或响应式应用。
- 误区:用了 Boot 就不需要理解 Spring。 自动配置减少样板配置,但 Bean 生命周期、代理、事务和容器条件仍决定实际行为。
- 追问:不用 Boot 能否使用 @RestController? 可以,只要引入并正确配置 Spring MVC 及 Servlet 环境,Controller 注解并不属于 Boot。
- 追问:Boot 自动配置会修改业务源码吗? 不会,它主要以带条件的配置类向容器注册 Bean,不是代码生成或源码改写。
- 追问:Starter 属于 Spring MVC 吗? Starter 是 Boot 的依赖聚合机制;Web Starter 会引入 MVC 等依赖,但二者不是同一概念。
八、加强记忆
Spring Framework 是底座,Spring MVC 是 Web 模块,Spring Boot 是建立在底座上的工程化启动与约定层。Controller 属于 MVC,Bean 和事务属于 Spring,自动配置、Starter、内嵌服务器及 Actuator 则是 Boot 带来的主要体验。