1、简述
Spring Boot 3 是一个重大版本(于 2022 年末正式发布),它在多个维度上做了较大的升级:
- 基线 Java 版本提升为 Java 17(要求至少 JDK 17)+ 支持更高版本。 ([baeldung.com][1])
- 从 Java EE(javax.)迁移到 Jakarta EE(jakarta.)命名空间。 ([GitHub][2])
- 深度集成原生镜像(native image)支持,利用 GraalVM 等技术用于 AOT 编译,从而提升启动速度、降低内存占用。 ([baeldung.com][1])
- 加强可观察性(Observability),通过 Micrometer + Micrometer Tracing 新 API 来提供统一的监控、追踪能力。 ([Medium][3])
- 底层依赖版本全面升级(Hibernate 6、Spring Data 2022、Spring Security 6、Tomcat/Jetty 等)以配合新生态。 ([GitHub][2])
因此,从 Spring Boot 2.x 升级至 3.x,不只是版本号变化,更是生态、平台、底层库的全方位晋级。项目在迁移时需做好兼容性评估、依赖版本调整,以及代码里命名空间/API 的迁移。

2、关键新特性解析
下面我挑几个比较"亮"的特性,逐条解析它们的意义、变化、以及在项目中的应用场景。
2.1 Java 17 作为基线 & 新语言特性可用
-
Spring Boot 3 要求至少使用 Java 17。也就是说如果当前项目还在 Java 8/11 上运行,必须先升级 JDK。 ([积极思维][4])
-
升级 Java 意味着你可以使用 record、sealed classes、text blocks 等新特性,从而简化 DTO、配置类等。 ([baeldung.com][1])
-
示例:
javapublic record UserDTO(Long id, String name, String email) {}在 Spring Boot 3 中,该 record 可作为请求/响应 DTO 被 Jackson 序列化/反序列化。 ([Medium][5])
应用建议:对于新项目,优先选用 Java 17;对于老项目,升级前需确认所有库都已支持 JDK 17(包括第三方依赖)。
2.2 Jakarta EE 迁移(javax.* → jakarta.*)
- Spring Boot 3 及其依赖(Spring Framework 6 等)已全面迁向 Jakarta EE 9+,也就意味着大量
javax.persistence.*、javax.servlet.*等包变为jakarta.persistence.*、jakarta.servlet.*等。 ([GitHub][2]) - 对于使用 JPA、Servlet、WebSocket、Jakarta EE 相关 API 的项目而言,迁移时必须修改 import,或者更新所用库以支持 jakarta 命名空间。 ([积极思维][4])
java
// 以前 (Spring Boot 2.x):
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class User {
@Id
private Long id;
private String name;
// ...
}
// 升级后 (Spring Boot 3.x):
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
@Entity
public class User {
@Id
private Long id;
private String name;
// ...
}
2.3 原生镜像支持(GraalVM / AOT 编译)
- Spring Boot 3 强化了对 AOT(Ahead-Of-Time)编译的支持,借助 GraalVM native image,可以将 Spring 应用编译为原生可执行文件,从而显著减少启动时间、降低内存占用。 ([baeldung.com][1])
- 在 release notes 中提到 "Spring Boot 3.0 applications can now be converted into GraalVM native images ..." ([GitHub][2])
在 pom.xml 或 build.gradle 中添加 AOT / native-image 插件。
xml
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>3.x.x</version>
<configuration>
<image>
<builder>paketobuildpacks/builder:tiny</builder>
</image>
</configuration>
</plugin>
执行命令构建 native 镜像:
mvn spring-boot:build-image
运行生成的可执行文件,启动速度、驻留内存会比传统 JVM 模式更优。
应用建议:如果项目部署于微服务、Serverless、容器环境,对启动时间或内存敏感,那么开启 native image 是值得考虑的。但也需评估兼容性、调试难度及 AOT 限制。
2.4 可观察性增强:Micrometer Observation API + Tracing
- 在 Spring Boot 3 中,Observation API(来自 Micrometer 1.10+)被自动配置,并整合 metrics + tracing。即开发者可以通过
ObservationRegistry来统一记录指标与追踪。 ([GitHub][2]) - Spring Web MVC/WebFlux 层也增强了对追踪(例如 OpenTelemetry、Zipkin)和问题详情 (Problem Details/RFC 7807) 的支持。 ([baeldung.com][1])
java
import io.micrometer.observation.Observation;
import io.micrometer.observation.ObservationRegistry;
import org.springframework.stereotype.Service;
@Service
public class MyService {
private final ObservationRegistry observationRegistry;
public MyService(ObservationRegistry observationRegistry) {
this.observationRegistry = observationRegistry;
}
public void doWork() {
Observation.createNotStarted("myService.doWork", observationRegistry)
.observe(() -> {
// 你的业务逻辑
});
}
}
以上代码使用 Observation API 记录一个业务操作,从而被 Micrometer 收集到指标/追踪数据。
应用建议:在微服务架构或云原生场景中,建议尽早开启可观察性方案(如 Actuator+Micrometer+OpenTelemetry)以便线上监控、追踪、诊断。迁移至 Spring Boot 3 时也应重点关注此项。
2.5 其他重要变化(简要列举)
@ConfigurationProperties+ 构造函数绑定(@ConstructorBinding)检测逻辑改进:如果类只有一个有参数构造函数,则无需再显式添加@ConstructorBinding。 ([GitHub][2])- 底层依赖、第三方库版本大幅升级,如 Hibernate 6.x、Spring Data 2022.x、Tomcat/Jetty 支持 Jakarta Servlet 6.0 等。 ([GitHub][2])
- 在 Web 层新增对 RFC7807 (Problem Details) 支持。 ([baeldung.com][1])
- 日志框架:增强了 Log4j2 支持,例如配置按 profile 区分、从环境变量查找属性等。 ([RabIT Solutions][6])
3、实践样例
下面整合几个典型场景的代码片段,帮助你在 Spring Boot 3 项目中快速落地。
样例 A:项目初始化(Maven)
xml
<properties>
<java.version>17</java.version>
<spring-boot.version>3.4.3</spring-boot.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- ...其他依赖... -->
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
样例 B:使用 record DTO + 控制器
java
// DTO
public record UserDTO(Long id, String name, String email) {}
// Controller
@RestController
@RequestMapping("/api/users")
public class UserController {
@GetMapping("/{id}")
public UserDTO getUser(@PathVariable Long id) {
// 模拟查询
return new UserDTO(id, "Alice", "alice@example.com");
}
}
样例 C:ConfigurationProperties 构造函数绑定
java
@ConfigurationProperties(prefix = "app.config")
public class AppConfig {
private final String host;
private final int port;
public AppConfig(String host, int port) {
this.host = host;
this.port = port;
}
public String getHost() {
return host;
}
public int getPort() {
return port;
}
}
// 使用时
@SpringBootApplication
@EnableConfigurationProperties(AppConfig.class)
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
在 Spring Boot 3 中,因为该类只有一个带参数构造函数,因此无需添加
@ConstructorBinding注解。 ([GitHub][2])
样例 D:使用 Observation API 进行自定义追踪/指标
(如前节所示)
java
@Service
public class MyService {
private final ObservationRegistry observationRegistry;
public MyService(ObservationRegistry observationRegistry) {
this.observationRegistry = observationRegistry;
}
public String process(String input) {
return Observation.createNotStarted("myService.process", observationRegistry)
.observe(() -> {
// 模拟耗时操作
try {
Thread.sleep(100);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
return "processed:" + input;
});
}
}
样例 E:构建原生镜像(示例命令)
假设你使用 Maven 构建:
mvn clean package spring-boot:build-image
将会使用 Buildpacks 构建一个 GraalVM native 可执行镜像。然后你可将该镜像部署到容器或云环境。
4、迁移建议与注意事项
- 版本依赖:确保所有依赖库(包括第三方)都已支持 Java 17 和 Jakarta EE 9+。例如 Hibernate 6、Spring Data 2022、Tomcat10/Jetty11 等。 ([GitHub][2])
- 命名空间变更 :大量
javax.*移动至jakarta.*,若项目中仍引用旧命名空间,会报错。迁移中注意搜索并替换。 - 测试和工具支持:升级后可能需要更新构建工具、插件版本(如 Maven 3.6+、Gradle 7+)。 ([积极思维][4])
- 兼容性:如果项目还在 Spring Boot 2.x,建议先升级至 2.7 然后再跳至 3.x,以减少破坏性变化。 ([RabIT Solutions][6])
- 原生镜像适用场景:虽然原生镜像启动快、内存少,但也有静态分析限制、调试复杂、工具链要求高。评估是否真的需要。
- 监控与可观察性优先考虑:在微服务/云环境下,追踪、指标变得尤为关键。建议同步升级 Micrometer + Actuator。
5、总结
Spring Boot 3 是一个里程碑式的版本,对语言基线、平台规范、运行时优化、可观察性等多个方面都做了全面升级。对于新项目,它是推荐选项;对于已有 Spring Boot 2.x 项目,迁移需要慎重规划。
通过上文所述的新特性解析和实践样例,希望你能快速上手 Spring Boot 3,并在项目中有效利用这些增强功能。