从 Spring Boot 2.x 到 Spring Boot 3.x:全面对比与快速上手指南
一、前言
Spring Boot 自诞生以来,凭借其“约定优于配置”的理念、开箱即用的设计和强大的生态支持,迅速成为 Java 开发领域的主流框架。随着 Java 语言的持续演进和开发者需求的提升,Spring Boot 也在不断升级。Spring Boot 3.x 是一次重大版本升级,不仅带来了对现代 Java 特性的全面支持,还对底层架构、依赖管理和性能进行了深度优化。
本文将从以下几个方面,详细对比 Spring Boot 2.x 与 3.x 的差异,并提供一套完整的从 2.x 迁移到 3.x 的实战指南。
二、Spring Boot 2.x 与 3.x 的核心区别
1. Java 版本要求的变化
版本 | 支持的最低 Java 版本 | 支持的最高 Java 版本 |
---|---|---|
Spring Boot 2.x | Java 8(推荐 Java 11) | Java 17(兼容) |
Spring Boot 3.x | Java 17 | Java 21(推荐) |
说明:
- Spring Boot 2.x 支持 Java 8 ~ Java 17,但官方推荐使用 Java 11。
- Spring Boot 3.x 强制要求最低 Java 17,不再支持 Java 8 和 Java 11。
- 这一变化意味着你必须升级 JDK 环境,同时也能够使用 Java 17 的新特性,如密封类、模式匹配、switch 表达式等。
2. Jakarta EE 的迁移(javax → jakarta)
这是 Spring Boot 3.x 中最显著的变化之一。
项目 | 包名变化 |
---|---|
Spring Boot 2.x | javax.* (Java EE) |
Spring Boot 3.x | jakarta.* (Jakarta EE) |
说明:
- 由于 Oracle 将 Java EE 移交给 Eclipse 基金会,后者将其更名为 Jakarta EE,所有包名从
javax.*
改为jakarta.*
。 - 所有与 Web、Servlet、JPA、Validation、WebSocket 等相关的类都受到影响。
- 例如:
javax.servlet.http.HttpServlet
→jakarta.servlet.http.HttpServlet
javax.persistence.Entity
→jakarta.persistence.Entity
javax.validation.constraints.NotNull
→jakarta.validation.constraints.NotNull
迁移建议:
- 使用 IDE(如 IntelliJ IDEA 或 Eclipse)进行全局替换。
- 检查第三方库是否支持 Jakarta EE 9+。
3. Spring Framework 版本升级
Spring Boot 版本 | Spring Framework 版本 |
---|---|
2.x | 5.x |
3.x | 6.0.x(甚至 6.1.x) |
说明:
- Spring Framework 6 是 Spring Boot 3.x 的基础,带来了对 Java 17 的全面支持。
- Spring 6 引入了新的 AOT(Ahead-of-Time)编译机制,用于支持 GraalVM Native Image。
- Spring 6 不再支持 Java 8、Java 9、Java 10、Java 11,仅支持 Java 17 及以上。
4. 对 GraalVM Native Image 的原生支持
Spring Boot 3.x 原生支持 GraalVM Native Image,这是其一大亮点。
- 可以将 Spring Boot 应用编译为原生可执行文件(Native Executable),极大提升启动速度和降低内存占用。
- 适用于 Serverless、云原生等对冷启动敏感的场景。
- 使用方式:
- 添加
spring-boot-starter-aot
依赖 - 使用
native-maven-plugin
或native-gradle-plugin
构建原生镜像
- 添加
示例:
<plugin><groupId>org.graalvm.buildtools</groupId><artifactId>native-maven-plugin</artifactId>
</plugin>
限制:
- 不支持反射、动态代理等 Java 特性(需在构建时配置元数据)
- 部分库(如 Hibernate、Spring Data)需要更新以支持 Native Image
5. 自动配置机制改进
Spring Boot 3.x 引入了新的自动配置机制:
- 使用
@AutoConfiguration
注解替代原来的@ConditionalOnClass
等组合注解 - 自动配置类现在可以更清晰地定义加载顺序(
@Order
) - 提供了更好的自动配置报告和诊断信息(
--debug
)
示例:
@AutoConfiguration
public class MyAutoConfiguration {// ...
}
6. Actuator 端点增强
- Actuator 模块全面升级,支持更细粒度的监控和管理
- 新增了
/actuator/health/liveness
和/actuator/health/readiness
端点,用于健康检查 - 默认端点路径从
/actuator/**
变为/actuator/**
(保持不变),但内部实现更健壮
7. 配置属性变更与弃用
Spring Boot 3.x 对大量配置属性进行了重命名、合并或移除:
- 使用
spring-boot-properties-migrator
工具可以帮助识别旧配置并提供迁移建议 - 示例变更:
spring.jpa.hibernate.use-new-id-generator-mappings
已弃用spring.datasource.configuration
替换为spring.datasource.hikari.*
8. 安全模块更新(Spring Security 6)
Spring Boot 3.x 默认使用 Spring Security 6:
- 更严格的默认安全策略
- 新的
SecurityFilterChain
配置方式(替代旧的WebSecurityConfigurerAdapter
) - 更好的 OAuth2 和 JWT 支持
示例新配置方式:
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests(auth -> auth.requestMatchers("/public/**").permitAll().anyRequest().authenticated()).formLogin(Customizer.withDefaults());return http.build();
}
三、从 Spring Boot 2.x 迁移到 3.x 的实战指南
1. 准备工作
- 升级 JDK 到 Java 17 或以上
- 更新 IDE 插件(如 Spring Tools Suite、IntelliJ IDEA 插件)
- 检查项目依赖是否支持 Spring Boot 3.x(查看 Maven Central 或 GitHub)
2. 修改项目依赖
Maven 项目示例:
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.3.0</version> <!-- 使用最新版本 --><relativePath/>
</parent>
Gradle 项目示例:
plugins {id 'org.springframework.boot' version '3.3.0'id 'io.spring.dependency-management' version '1.1.2'
}
3. 替换包名(javax → jakarta)
使用 IDE 的全局搜索替换功能,将所有 javax.*
替换为 jakarta.*
。
例如:
import javax.servlet.http.HttpServlet;
// 替换为
import jakarta.servlet.http.HttpServlet;
4. 使用 Spring Boot Properties Migrator 工具
添加依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-properties-migrator</artifactId><scope>runtime</scope>
</dependency>
运行应用时会输出配置属性的迁移建议。
5. 检查第三方库兼容性
确保所有依赖库支持 Spring Boot 3.x 和 Jakarta EE 9+,例如:
依赖库 | 是否支持 Spring Boot 3.x |
---|---|
Hibernate ORM 6.x | 是 |
Spring Data JPA 3.x | 是 |
Thymeleaf 3.1+ | 是 |
Flyway 9+ | 是 |
Liquibase 4.17+ | 是 |
MyBatis 3.5.10+ | 是 |
6. 使用 AOT 编译(可选)
如果你希望构建原生镜像,可以尝试使用 AOT 编译:
./mvnw spring-boot:build-image -DskipTests
或使用 GraalVM 插件构建原生可执行文件。
7. 单元测试与集成测试
- 升级测试依赖(如 JUnit 5、Mockito 4)
- 使用
@SpringBootTest
和TestRestTemplate
进行集成测试 - 检查是否所有自动配置类都正确加载
四、Spring Boot 3.x 新特性一览(建议掌握)
特性 | 说明 |
---|---|
AOT 编译支持 | 支持提前编译,用于 GraalVM Native Image |
Jakarta EE 9+ 支持 | 所有 API 使用 jakarta.* 包 |
Spring Security 6 | 更强的安全控制、新的配置方式 |
Actuator 增强 | 支持 Liveness/Readiness 探针 |
自动配置改进 | 使用 @AutoConfiguration 替代条件注解组合 |
配置属性报告 | 更清晰的配置属性提示和迁移建议 |
GraalVM Native Image 支持 | 可构建原生可执行文件 |
响应式编程增强 | WebFlux、RSocket、Project Reactor 更完善 |
五、总结
Spring Boot 3.x 是一个具有里程碑意义的版本,它不仅顺应了 Java 语言的发展趋势,也大幅提升了开发效率和运行性能。尽管从 2.x 迁移到 3.x 需要一定的工作量,尤其是包名替换、依赖更新和配置迁移,但这些变化是值得的。
建议学习路径:
- 学习 Java 17 新特性
- 掌握 Jakarta EE 9+ 包名变化
- 熟悉 Spring Framework 6 的新特性
- 实践 GraalVM Native Image 构建
- 使用 Spring Security 6 的新配置方式
- 深入理解 Spring Boot 3.x 的自动配置机制
六、参考资料
- Spring Boot 3.0 Release Notes
- Spring Framework 6 Migration Guide
- Jakarta EE 9 Specification
- Spring Native Documentation