Spring Boot 3 新特性详解:从 Jakarta EE 到 GraalVM 原生镜像

📅

✍️


引言

Spring Boot 3.x 是一次重大升级,基于 Spring Framework 6,要求 JDK 17+,带来了 Jakarta EE 迁移、原生镜像支持、可观测性增强等诸多新特性。

1. JDK 17 基线

Spring Boot 3 将最低 Java 版本要求提升至 JDK 17,这意味着你可以充分利用 Java 17 的所有新特性:

  • Record 类:简洁的数据载体
  • 密封类(Sealed Classes):限制继承层次
  • 模式匹配(Pattern Matching)
  • Text Blocks:多行字符串
  • Switch 表达式
// 使用 Record 定义 DTO
public record UserDto(Long id, String name, String email) {
    // 自动生成构造器、getter、equals、hashCode、toString
}

2. Jakarta EE 9+ 迁移

这是最重要的破坏性变更。所有 javax.* 包名改为 jakarta.*

Spring Boot 2.x Spring Boot 3.x
javax.persistence.* jakarta.persistence.*
javax.servlet.* jakarta.servlet.*
javax.validation.* jakarta.validation.*
javax.transaction.* jakarta.transaction.*
// Spring Boot 3 的 Controller
@RestController
@RequestMapping("/api/v1")
public class UserController {
    
    @GetMapping("/users/{id}")
    public ResponseEntity<UserDto> getUser(@PathVariable Long id) {
        // Jakarta Validation
        return ResponseEntity.ok(new UserDto(id, "张三", "zhangsan@example.com"));
    }
}

3. 原生镜像(GraalVM Native Image)

Spring Boot 3 对 GraalVM 原生镜像提供了一等公民支持,可以将应用编译为独立的可执行文件:

  • 启动速度:从秒级降至毫秒级(通常 < 100ms)
  • 内存占用:减少 50%-80%
  • 容器化友好:无需 JVM,镜像体积大幅缩减
# 使用 GraalVM 编译原生镜像
./mvnw -Pnative native:compile

# 直接运行可执行文件
./target/my-app

4. 可观测性(Observability)

Spring Boot 3 引入了全新的可观测性支持,基于 Micrometer 和 Micrometer Tracing:

  • Metrics:指标收集,支持 Prometheus、InfluxDB 等
  • Tracing:分布式追踪,支持 Zipkin、Jaeger
  • Health:健康检查端点增强
# 开启所有 Actuator 端点
management:
  endpoints:
    web:
      exposure:
        include: health,info,metrics,prometheus
  tracing:
    sampling:
      probability: 1.0

5. HTTP 接口声明式客户端

Spring Framework 6 引入了 @HttpExchange 注解,提供了声明式的 HTTP 客户端:

@HttpExchange("/api/v1")
public interface UserClient {
    
    @GetExchange("/users/{id}")
    UserDto getUser(@PathVariable Long id);
    
    @PostExchange("/users")
    UserDto createUser(@RequestBody UserDto user);
}

// 使用
@Bean
public UserClient userClient() {
    WebClient client = WebClient.create("http://localhost:8080");
    return HttpServiceProxyFactory
        .builderFor(WebClientAdapter.create(client))
        .build()
        .createClient(UserClient.class);
}

6. Problem Details(RFC 7807)

Spring Boot 3 内置支持 RFC 7807 Problem Details,提供标准化的错误响应格式:

@RestControllerAdvice
public class GlobalExceptionHandler {
    
    @ExceptionHandler(ResourceNotFoundException.class)
    public ProblemDetail handleNotFound(ResourceNotFoundException ex) {
        ProblemDetail problem = ProblemDetail
            .forStatusAndDetail(HttpStatus.NOT_FOUND, ex.getMessage());
        problem.setTitle("Resource Not Found");
        problem.setProperty("timestamp", Instant.now());
        return problem;
    }
}

总结

Spring Boot 3 是一次质的飞跃。JDK 17 基线、Jakarta EE 迁移、原生镜像支持、增强的可观测性和声明式 HTTP 客户端,都让它在性能和开发体验上大幅领先 2.x 版本。如果你正在开启新项目,Spring Boot 3 是最佳选择。