从 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.HttpServletjakarta.servlet.http.HttpServlet
    • javax.persistence.Entityjakarta.persistence.Entity
    • javax.validation.constraints.NotNulljakarta.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-pluginnative-gradle-plugin 构建原生镜像

示例:

xml 复制代码
<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

示例:

java 复制代码
@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 支持

示例新配置方式:

java 复制代码
@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 项目示例:
xml 复制代码
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.3.0</version> <!-- 使用最新版本 -->
    <relativePath/>
</parent>
Gradle 项目示例:
groovy 复制代码
plugins {
    id 'org.springframework.boot' version '3.3.0'
    id 'io.spring.dependency-management' version '1.1.2'
}

3. 替换包名(javax → jakarta)

使用 IDE 的全局搜索替换功能,将所有 javax.* 替换为 jakarta.*

例如:

java 复制代码
import javax.servlet.http.HttpServlet;
// 替换为
import jakarta.servlet.http.HttpServlet;

4. 使用 Spring Boot Properties Migrator 工具

添加依赖:

xml 复制代码
<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 编译:

bash 复制代码
./mvnw spring-boot:build-image -DskipTests

或使用 GraalVM 插件构建原生可执行文件。


7. 单元测试与集成测试

  • 升级测试依赖(如 JUnit 5、Mockito 4)
  • 使用 @SpringBootTestTestRestTemplate 进行集成测试
  • 检查是否所有自动配置类都正确加载

四、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 需要一定的工作量,尤其是包名替换、依赖更新和配置迁移,但这些变化是值得的。

建议学习路径:

  1. 学习 Java 17 新特性
  2. 掌握 Jakarta EE 9+ 包名变化
  3. 熟悉 Spring Framework 6 的新特性
  4. 实践 GraalVM Native Image 构建
  5. 使用 Spring Security 6 的新配置方式
  6. 深入理解 Spring Boot 3.x 的自动配置机制

六、参考资料

相关推荐
蚂蚁背大象15 分钟前
Rust 所有权系统是为了解决什么问题
后端·rust
子玖2 小时前
go实现通过ip解析城市
后端·go
Java不加班2 小时前
Java 后端定时任务实现方案与工程化指南
后端
心在飞扬2 小时前
RAG 进阶检索学习笔记
后端
Moment2 小时前
想要长期陪伴你的助理?先从部署一个 OpenClaw 开始 😍😍😍
前端·后端·github
Das1_2 小时前
【Golang 数据结构】Slice 底层机制
后端·go
得物技术2 小时前
深入剖析Spark UI界面:参数与界面详解|得物技术
大数据·后端·spark
古时的风筝2 小时前
花10 分钟时间,把终端改造成“生产力武器”:Ghostty + Yazi + Lazygit 配置全流程
前端·后端·程序员
Cache技术分享2 小时前
340. Java Stream API - 理解并行流的额外开销
前端·后端