从 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 的自动配置机制

六、参考资料

相关推荐
蓝倾7 分钟前
淘宝获取商品分类接口操作指南
前端·后端·fastapi
小希爸爸11 分钟前
curl 网络测试常用方法
后端
星星电灯猴43 分钟前
iOS WebView 调试实战 页面跳转失效与历史记录错乱的排查路径
后端
重楼七叶一枝花1 小时前
MySQL的在线模式学习笔记
后端·mysql
代码男孩1 小时前
python包管理工具uv的使用
后端
CodeWolf2 小时前
关于端口号配置优先级的问题
后端
C182981825752 小时前
Ribbon轮询实现原理
后端·spring cloud·ribbon
lemon_sjdk2 小时前
LWJGL教程(2)——游戏循环
java·人工智能·算法·游戏
鹿鹿的布丁2 小时前
freeswitch通过编译方式安装
后端
JavaDog程序狗2 小时前
【软件环境】Windows安装JDK21
后端