Spring Boot 3.0(2022 年底发布)底层依赖 Spring Framework 6.x。本文汇总从 2.x 升级到 3.x 时最常见的破坏性变更与约束。框架总览见 Spring Boot。

Spring Boot 与 Spring Framework 版本对应

Spring Boot Spring Framework
3.0.x 6.0.x
3.2.x 6.1.x
3.3.x / 3.4.x 6.1.x / 6.2.x
3.5.x 6.2.x

1. Java 版本要求

Spring Boot 3.x 最低要求 Java 17。

2. javax → jakarta 命名空间迁移(最大变更)

Java EE 已捐赠给 Eclipse 基金会,品牌更名为 Jakarta EE,所有包名从 javax.* 改为 jakarta.*。这是代码层面影响最广的变更,几乎所有用到 Servlet、JPA、Bean Validation 的代码都要修改:

旧包名(javax) 新包名(jakarta)
javax.servlet.* jakarta.servlet.*
javax.persistence.* jakarta.persistence.*
javax.validation.* jakarta.validation.*
javax.transaction.* jakarta.transaction.*
javax.annotation.* jakarta.annotation.*
import jakarta.servlet.http.HttpServletRequest;
import jakarta.persistence.Entity;

3. Spring Security 6.x:WebSecurityConfigurerAdapter 彻底移除

WebSecurityConfigurerAdapter 已彻底移除,必须改为注册 SecurityFilterChain Bean,详见 Spring Security。

Lambda DSL 是什么

Spring Security 的配置支持两种 API 风格:旧的链式写法和新的 Lambda DSL 写法。

旧写法(链式 API,Spring Security 5.x 之前):

http
    .authorizeRequests()
        .antMatchers("/public").permitAll()
        .anyRequest().authenticated()
        .and()
    .formLogin()
        .loginPage("/login")
        .and()
    .csrf().disable();

Lambda DSL 写法(Spring Security 5.2+ 引入,6.x 强制):

http
    .authorizeHttpRequests(auth -> auth
        .requestMatchers("/public").permitAll()
        .anyRequest().authenticated()
    )
    .formLogin(form -> form
        .loginPage("/login")
    )
    .csrf(csrf -> csrf.disable());
特性 旧链式写法 Lambda DSL
结构 扁平链式,靠 .and() 拼接 嵌套 Lambda,结构清晰
可读性 需要靠缩进约定 作用域边界明确
IDE 支持 容易混淆配置层级 类型推断更准确
Spring Security 6.x 已废弃 唯一支持的写法

Spring Security 6.x 移除了旧的链式 API(如 authorizeRequests()、.and()),只保留 Lambda DSL,因为它更清晰地表达了每个配置块的边界,减少配置错误。

4. Hibernate 6.x

ORM 层升级到 Hibernate 6,部分 HQL/JPQL 语法更严格,一些隐式类型转换不再支持,自定义类型映射 API 有变化。

5. AOT 与 GraalVM Native Image

Spring Boot 3.x 正式支持 GraalVM Native Image 编译,可以将应用编译为原生可执行文件,启动时间从秒级降到毫秒级,但对反射、动态代理等有额外约束。构建链依赖 Spring AOT 在打包前处理 IoC 容器;详见 Spring AOT 简介 与 GraalVM Native Image 简介。

参考