Spring Boot 概述
约 1670 字大约 6 分钟
布欧-Lewyon
2026-05-15
首页 › Spring Boot › 导读与版本对齐 › Spring Boot 概述
本节从 Spring Boot 的起源与核心价值出发,明确各版本的技术基线,并梳理 2.x → 3.x → 4.x 的主要差异。
Spring Boot 解决什么问题
在 Spring Boot 出现之前,搭建一个 Spring Web 应用需要:配置 web.xml、配置 DispatcherServlet、编写 Spring XML 或 Java Config、处理依赖版本冲突、部署 WAR 到外部容器。每一步都可能出错,且跨项目重复。
Spring Boot 将上述过程压缩为三个约定:
- 约定优于配置(Convention over Configuration):根据 classpath 上的依赖和配置属性自动推断 Bean 的装配行为。
- 内嵌容器:应用自带 Tomcat / Jetty / Undertow,无需部署 WAR,
java -jar直接启动。 - 可执行 JAR:Maven/Gradle 插件将应用打包为 fat JAR,包含所有依赖和内嵌容器。
Boot 3.x 基线
Spring Boot 3.x 基于以下技术栈:
| 组件 | 版本基线 |
|---|---|
| Spring Framework | 6.x |
| JDK | 17+(最低要求) |
| Servlet API | Jakarta EE 9+(jakarta.*) |
| 依赖管理 | Jakarta EE 10 规范 |
从 Boot 2 到 Boot 3 的核心变化
| 维度 | Boot 2.x | Boot 3.x |
|---|---|---|
| Java 基线 | Java 8+ | Java 17+ |
| 命名空间 | javax.* | jakarta.* |
| Spring Framework | 5.x | 6.x |
| Hibernate | 5.x | 6.x(JPA 3 支持) |
| 容器 | Tomcat 9 | Tomcat 10 |
| OpenAPI 工具 | SpringFox(已停更) | Springdoc(推荐) |
| 废弃组件 | 少量 | spring.factories → spring.aot.factories 等 |
迁移提示:从 Boot 2 升级时,最直接的改动是将所有 javax.* 导入替换为 jakarta.*(如 javax.servlet → jakarta.servlet、javax.validation → jakarta.validation),并确保 JDK 17+。
包名变化示例
// Boot 2 (javax)
import javax.persistence.Entity;
import javax.validation.constraints.NotNull;
// Boot 3 (jakarta)
import jakarta.persistence.Entity;
import jakarta.validation.constraints.NotNull;Boot 4.x 基线
Spring Boot 4.x 基于以下技术栈:
| 组件 | 版本基线 |
|---|---|
| Spring Framework | 7.x |
| JDK | 21+(最低要求,官方建议 23+) |
| Servlet API | Jakarta EE 11(jakarta.* 延续) |
| 依赖管理 | Jakarta EE 11 规范 |
截至本文撰写时间(2026 年中),Boot 4.x 已发布 GA 版本,推荐新项目直接选用 4.x。
从 Boot 3 到 Boot 4 的核心变化
| 维度 | Boot 3.x | Boot 4.x |
|---|---|---|
| Java 基线 | Java 17+ | Java 21+(建议 23+) |
| Spring Framework | 6.x | 7.x |
| JDK 基线 | 17+ | 21+ |
| Jakarta EE | 9+/10 | 11(Servlet 6.1、JPA 3.2) |
| Hibernate | 6.x(ORM) | 7.x |
| Tomcat | 10.x | 11.x |
| 虚拟线程 | 实验性支持(spring.threads.virtual.enabled) | 全面支持,虚拟线程为默认 Web 线程模型 |
| RestClient | 可选 | 主推,替代 RestTemplate(已标记为@Deprecated(since="4.0")) |
| CDS(Class Data Sharing) | 需手动配置 | 开箱支持,AOT 编译自动生成 CDS 存档 |
| GraalVM Native Image | Beta → GA | 稳定生产级别,@ConfigurationProperties 与反射类无需额外配置 |
| 模块化 | — | spring-boot-starter-parent 按模块拆分,非 Web 项目可排除 Web 依赖 |
| SSL 配置 | server.ssl.* | 统一为 spring.ssl.bundle.* 上下文管理 |
| 废弃清理 | 部分 | 移除 RestTemplate 核心 API、移除 JUnit 4 兼容、移除 spring.factories 机制 |
迁移提示:从 Boot 3 升级到 4 的第一步是确认 JDK 21+。代码层面改动较小(包名仍为 jakarta.*),但需注意:
RestTemplate标注为 deprecated,推荐迁移到RestClient- Hibernate 7.x 有少量 API 变化(如
Session方法签名调整) - Tomcat 11.x 基于 Servlet 6.1,检查自定义 Filter/Servlet 是否兼容
- 检查所有使用
spring.factories的自动配置,迁移到META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
RestClient 示例
// Boot 3(仍可用但已标记废弃)
RestTemplate restTemplate = new RestTemplate();
String result = restTemplate.getForObject("https://api.example.com/users", String.class);
// Boot 4(推荐)
RestClient restClient = RestClient.create();
String result = restClient.get()
.uri("https://api.example.com/users")
.retrieve()
.body(String.class);虚拟线程配置变化
# Boot 3(实验性)
spring:
threads:
virtual:
enabled: true
# Boot 4:默认启用,无需单独配置;如需禁用:
spring:
threads:
virtual:
enabled: false版本选型
| 场景 | 推荐版本 |
|---|---|
| 全新项目(JDK 21+ 可用) | Boot 4.x |
| 现有 Boot 3 项目维护 | 继续使用 3.x,按计划升级 |
| 仍需 JDK 17 兼容 | Boot 3.x(最后支持 JDK 17 的大版本) |
| 新项目但环境只提供 JDK 17 | Boot 3.4.x(仍受官方支持) |
版本总览
| 版本 | 发布时间 | Spring Framework | Java 基线 | 状态 |
|---|---|---|---|---|
| 2.x | 2018~2022 | 5.x | 8+ | 已停止维护(2025 年底 EOL) |
| 3.x | 2022~2025 | 6.x | 17+ | 维护期 |
| 4.x | 2025~ | 7.x | 21+ | 当前主线 |
进阶阅读:自动配置机制
初学者可先跳过,不影响后续章节学习。
理解 Spring Boot 的自动配置原理是从使用者进阶为架构师的关键一步。自动配置的核心在 @EnableAutoConfiguration 注解中。
注解展开
@SpringBootApplication // 复合注解
├── @SpringBootConfiguration // → @Configuration
├── @ComponentScan // 组件扫描
└── @EnableAutoConfiguration // 自动配置入口
└── @Import(AutoConfigurationImportSelector.class)AutoConfigurationImportSelector 实现了 DeferredImportSelector 接口,在普通 @Configuration 类全部解析完成后才执行——这是为了保证开发者自定义的 @Bean 优先于自动配置。
配置类加载流程
条件注解求值
@ConditionalOnClass(name = "org.h2.Driver") // 类路径存在 H2 驱动时生效
@ConditionalOnMissingBean(DataSource.class) // 没有自定义 DataSource 时生效
@ConditionalOnProperty(prefix = "spring.datasource", name = "url") // 配置存在时生效ConfigurationClassParser 在处理每个自动配置类时,调用 ConditionEvaluator.shouldSkip() 依次检查所有 @Conditional 注解。只有当全部条件通过时,该配置类中的 @Bean 定义才会注册到容器。
生产意识:自动配置类加载时,Spring Boot 会将
AutoConfiguration.imports中的所有类名读入内存,然后逐条评估条件。如果 classpath 上有大量无用的 jar 引用了自动配置类(如引入spring-boot-starter-data-jpa但实际不使用 JPA),虽然条件不满足不会注入 Bean,但类加载和条件求值仍然消耗启动时间。生产启动优化时应通过spring.autoconfigure.exclude显式排除不需要的自动配置类,减少无谓的类加载和条件评估。
小结
- Spring Boot 的核心价值:自动配置 + 起步依赖 + 内嵌容器 + 可执行 JAR。
- Boot 3.x 基线:Spring Framework 6、Jakarta EE 9+、JDK 17+。
- Boot 4.x 基线:Spring Framework 7、Jakarta EE 11、JDK 21+。
- Boot 2→3 的核心变化:
javax→jakarta包名迁移、Framework 5→6。 - Boot 3→4 的核心变化:虚拟线程默认启用、
RestClient取代RestTemplate、Hibernate 7、CDS 开箱支持、JDK 21+ 基线。 - 易错:Boot 4 的虚拟线程默认开启,如果代码中使用
ThreadLocal且未清理可能导致问题——考虑迁移到ScopedValue(JDK 21+)。RestTemplate仍能工作但不推荐新代码使用。Boot 4 最低 JDK 21,不能在 JDK 17 上运行。 - 思考任务:打开 Spring Initializr,分别选择 Boot 3.x 和 4.x 版本,对比生成的
pom.xml中父 POM 版本、Java 版本默认值以及可选的依赖项差异。
下一节:快速入门
