今日在闲逛Spring Boot官方网站时,偶然发现继Spring Boot3.5.0版本GA之后,出现了4.0.0-SNAPSHOT版本。这意味着Spring Boot 4.0版本已经开始问世了。今天就一起来聊聊关于Spring Boot4的新版本变更。
从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了:
Spring Boot 4.0将GraalVM原生编译从实验特性升级为正式生产级支持,通过AOT(Ahead-of-Time)编译实现冷启动时间与内存占用的数量级优化:
不过使用时,需要引入额外依赖项:
<dependency>
<groupId>org.springframework.experimental</groupId>
<artifactId>spring-native</artifactId>
<version>0.12.0</version>
</dependency>
过AOT编译将应用转化为原生镜像,实现冷启动时间降低90%,内存占用减少80%。
// 启用GraalVM原生编译配置
@NativeHint(
options = {"--enable-http", "--enable-https"},
resources = @Resource(patterns = ".*.properties")
)
public class NativeConfig implements NativeConfiguration {}
生产建议:结合spring-boot-maven-plugin的build-image目标生成Docker镜像。
于JDK 21的虚拟线程特性,Spring Boot 4.0重构线程池模型以支持百万级并发:
// 全局启用虚拟线程
spring:
threads:
virtual:
enabled: true
// 异步任务无需修改
@Async
public CompletableFuture<String> fetchData() {
return CompletableFuture.completedFuture("Data from virtual thread");
}
Spring Boot 4.0版本中RequestMapping引入了version进行版本控制,可以优雅管理多版本API。
@RestController
@RequestMapping("/api/user")
public class UserController {
@GetMapping(version = "1")
public UserV1 getUserV1() { /* 旧版逻辑 */ }
@GetMapping(version = "2")
public UserV2 getUserV2() { /* 新版逻辑 */ }
}
取代Feign的HttpExchange注解,代码量减少60%。
// 声明式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();
}
已经放弃了对Jackson 2.x的支持,全面升级为3.x
使用JSpecify注解强化空指针防护。
本文系作者在时代Java发表,未经许可,不得转载。
如有侵权,请联系nowjava@qq.com删除。