1、序言
今日在闲逛Spring Boot官方网站时,偶然发现继Spring Boot3.5.0版本GA之后,出现了4.0.0-SNAPSHOT版本。这意味着Spring Boot 4.0版本已经开始问世了。今天就一起来聊聊关于Spring Boot4的新版本变更。
牛马们直呼,Spring Boot3都还没学完,4就来了。

2、更新一览
2.1、Spring Framework 7.0
从Spring Boot 4.0-SNAPSHOT开始,至少需要Java 17支持,还需要 Spring Framework 7.0.0-SNAPSHOT 或更高版本。同时需要maven 3.6.3或更高的版本,Gradle 7.6.4或更高的版本。
我们通过Idea构建一个Spring Boot 4.0相关项目,已经可以选择4.0.0-SNAPSHOT的Spring Boot版本。我这里Idea版本是2024.3.4:

选择后,加载依赖可以发现Spring Framework版本已经是7.0-SNAPSHOT了:

2.2、GraalVM原生镜像深度集成
Spring Boot 4.0将GraalVM原生编译从实验特性升级为正式生产级支持,通过AOT(Ahead-of-Time)编译实现冷启动时间与内存占用的数量级优化:
- 冷启动效率:传统JVM模式下500ms启动的微服务,编译为原生镜像后降至50ms以内,适用于Serverless场景突发流量响应
- 内存占用削减:典型微服务堆内存从2GB缩减至120MB级别,资源成本降低80%以上
- 技术适配:通过@NativeHint注解显式配置反射与资源加载规则,官方提供Maven插件自动化分析依赖项兼容性
不过使用时,需要引入额外依赖项:
xml
<dependency>
<groupId>org.springframework.experimental</groupId>
<artifactId>spring-native</artifactId>
<version>0.12.0</version>
</dependency>
过AOT编译将应用转化为原生镜像,实现冷启动时间降低90%,内存占用减少80%。
java
// 启用GraalVM原生编译配置
@NativeHint(
options = {"--enable-http", "--enable-https"},
resources = @Resource(patterns = ".*.properties")
)
public class NativeConfig implements NativeConfiguration {}
生产建议:结合spring-boot-maven-plugin的build-image目标生成Docker镜像。
2.3、虚拟线程支持
于JDK 21的虚拟线程特性,Spring Boot 4.0重构线程池模型以支持百万级并发:
- 异步处理优化:在支付网关场景中,每秒请求处理量(RPS)从1.2万提升至8.5万,CPU占用率下降40%
- 无缝启用:通过spring.threads.virtual.enabled=true全局启用,原有@Async注解无需修改
- 监控增强:Actuator新增/virtual-threads端点,实时监控线程状态与阻塞事件
java
// 全局启用虚拟线程
spring:
threads:
virtual:
enabled: true
// 异步任务无需修改
@Async
public CompletableFuture<String> fetchData() {
return CompletableFuture.completedFuture("Data from virtual thread");
}
2.3、API版本控制
Spring Boot 4.0版本中RequestMapping引入了version进行版本控制,可以优雅管理多版本API。
java
@RestController
@RequestMapping("/api/user")
public class UserController {
@GetMapping(version = "1")
public UserV1 getUserV1() { /* 旧版逻辑 */ }
@GetMapping(version = "2")
public UserV2 getUserV2() { /* 新版逻辑 */ }
}
2.4、声明式HTTP客户端
取代Feign的HttpExchange注解,代码量减少60%。
java
// 声明式HTTP接口
public interface UserService {
@GetExchange("/users/{id}")
User getUser(@PathVariable("id") Long id);
}
// 自动代理注入
@Bean
HttpServiceProxyFactory proxyFactory(RestClient.Builder builder) {
return HttpServiceProxyFactory.builderFor(RestClientAdapter.create(builder.build())).build();
}
2.5、其他更新
2.5.1、支持 Jackson 3.x
已经放弃了对Jackson 2.x的支持,全面升级为3.x
2.5.2、Null安全改进
使用JSpecify注解强化空指针防护。
java
import org.jspecify.annotations.*;
public class UserService {
public @NonNull User createUser(@Nullable String defaultName) {
return new User(defaultName != null ? defaultName : "Guest");
}
}
2.5.3、Jakarta EE 10命名空间变更
- Jakarta EE 10命名空间(替换javax为jakarta)。
2.5.4、删除的API
- Spring JCL 已停用。spring-jcl 模块已被删除,以支持 Apache Commons Logging 1.3.0。此更改对于大多数应用程序应该是透明的,因为 spring-jcl 是传递依赖项,并且日志记录 API 调用不应更改。
- 删除了对 javax.annotation 和 javax.inject 注释的支持。
- Spring MVC 的 XML 配置名称空间现在被弃用,取而代之的是 Java 配置体。
- Spring TestContext 框架中的 JUnit 4 支持现在已经被弃用。
3、小结
目前Spring Boot 4.0还处在开发阶段,并不稳定。真实项目中还是建议使用3.5.0-GA版本。Spring Boot作为现在Java程序员必学的一个经典框架之一,了解他们的演变过程可以帮助我们更好的学习这个框架。
想要了解更多的变更记录,可以查看:github.com/spring-proj...