基础要求与依赖变化

特性 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
// Spring Boot 3 中使用 Jakarta Servlet
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
# META-INF/spring.factories (Spring Boot 2 方式,已在 3.0 中弃用)
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
<!-- pom.xml -->
<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
// 在 Spring Boot 3 中,可观察性得到增强
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 原生编译、增强的可观察性、改进的安全特性以及自动配置机制的现代化。

升级前注意事项:

  1. Java 版本:确保使用 Java 17 或更高版本
  2. 包名迁移:将代码中的javax包名替换为jakarta
  3. 依赖检查:检查所有第三方依赖是否有与 Spring Boot 3 兼容的版本
  4. 自动配置:如果拥有自定义 Starter,需将 spring.factories 替换为 AutoConfiguration.imports 文件