基础要求与依赖变化
| 特性 |
Spring Boot 2 |
Spring Boot 3 |
说明 |
| Java 版本 |
Java 8+ |
Java 17+ |
Spring Boot 3 强制要求 Java 17 或更高版本 |
| Servlet API |
Javax Servlet |
Jakarta Servlet |
包名从 javax 迁移至 jakarta |
| Spring Framework |
Spring Framework 5 |
Spring Framework 6 |
|
Spring Boot 3 示例 (Jakarta API):
1 2 3 4 5 6 7 8 9 10 11 12
| import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse;
@WebServlet("/example") public class ExampleServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) { } }
|
自动配置机制变更
Spring Boot 3 弃用了 /META-INF/spring.factories 文件,引入了新的自动配置机制。
Spring Boot 2 方式 (META-INF/spring.factories):
1 2 3
| org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.example.MyAutoConfiguration
|
Spring Boot 3 方式 (META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports):
1 2
| # META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports (Spring Boot 3 方式) com.example.MyAutoConfiguration
|
GraalVM 原生镜像支持
Spring Boot 3 通过 Spring Native 提供了对 GraalVM 原生镜像的正式支持,显著提升启动速度和降低内存占用。
Maven 配置示例 (Spring Boot 3):
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <image> <builder>paketobuildpacks/builder-jammy-base</builder> </image> </configuration> </plugin> </plugins> </build>
|
应用可观察性增强
Spring Boot 3 显著提升了应用的可观察性,默认集成 Micrometer 1.10+,并引入了全新的可观察 API,自动配置 Micrometer Tracing。
示例:集成 Micrometer 追踪
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| import io.micrometer.observation.Observation; import io.micrometer.observation.ObservationRegistry;
@RestController public class MyController {
private final ObservationRegistry observationRegistry;
public MyController(ObservationRegistry observationRegistry) { this.observationRegistry = observationRegistry; }
@GetMapping("/example") public String exampleEndpoint() { return Observation.createNotStarted("example.operation", observationRegistry) .observe(() -> { return "Hello, Observability!"; }); } }
|
Web 与网络特性
WebSocket (Spring Boot 3):
配置方式在 Spring Boot 2 和 3 中基本相同,主要区别在于底层依赖从javax.websocket迁移到了jakarta.websocket。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| @Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer {
@Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(myHandler(), "/ws/{roomId}") .addInterceptors(new MyWebSocketHandshakeInterceptor()) .setAllowedOrigins("*"); }
@Bean public WebSocketHandler myHandler() { return new MyWebSocketHandler(); } }
|
HTTP 接口 (Spring Boot 3 + Jakarta):
Controller 的编写方式没有变化,但注意 HttpServletRequest、HttpServletResponse 等类需要从jakarta.servlet导入。
1 2 3 4 5 6 7 8
| @RestController public class ExampleController {
@GetMapping("/api/data") public ResponseEntity<String> getData() { return ResponseEntity.ok("Data from Spring Boot 3"); } }
|
安全增强
Spring Boot 3 集成了 Spring Security 6.0,其 OAuth2 支持已从旧版的 OAuth2 1.0 迁移到 OAuth2 2.1,带来了多项改进和安全修复。
Spring Boot 3 安全配置示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| @Configuration @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { return http .authorizeHttpRequests(auth -> auth .requestMatchers("/public/**").permitAll() .anyRequest().authenticated() ) .oauth2ResourceServer(oauth2 -> oauth2 .jwt(Customizer.withDefaults()) ) .build(); } }
|
其他重要特性
- 第三方库支持增强:Spring Boot 3 增强了对许多流行第三方库的自动配置支持
- 响应式编程深化:正式支持 R2DBC 1.0 并优化了 Spring WebFlux 性能
- 测试:强制使用 JUnit Jupiter(JUnit 5),不再支持 JUnit 4
总结与升级建议
Spring Boot 3 是一个重大更新版本,它要求 Java 17+ 并迁移至 Jakarta EE API,带来了 GraalVM 原生编译、增强的可观察性、改进的安全特性以及自动配置机制的现代化。
升级前注意事项:
- Java 版本:确保使用 Java 17 或更高版本
- 包名迁移:将代码中的
javax包名替换为jakarta
- 依赖检查:检查所有第三方依赖是否有与 Spring Boot 3 兼容的版本
- 自动配置:如果拥有自定义 Starter,需将
spring.factories 替换为 AutoConfiguration.imports 文件