
首先来讲,SpringBoot4是SpringBoot的大版本更新,说实话真的是更新的比较猛的,并且变化是非常大的,下面我们就来好好的捋一捋。
这是个什么玩意?
Spring Boot 4.0是Spring Boot的一个重大的更新版本,距离Spring Boot 3.0已经过去了一段时间了,所以这次的更新并不是小打小闹的,而是从底层上进行了大的改动,搞的跟重构一样,下面我们就来看看。
先说个比较直观的变化,就是最低的JDK版本要求直接是从JDK17起步了,并且官方推荐的JDK21这个版本,也就是说要是在项目中还在用JDK8或者是JDK11,那就根本用不了所以先要升级JDK的版本才能用Spring Boot 4.0。
其实这也是可以理解的,毕竟JDK17人家可是LTS版本,而且JDK21的虚拟线程技术确实是比较香的,虽然很多人可能对这东西不是特别的了解,但是推荐别墨迹了,赶紧升级试试慢慢开始学习么。
核心变化盘点
1、JDK版本要求
在前面的介绍中也说了,最低版本是JDK17,推荐版本是JDK21。这是为什么呢?首先JDK21中有虚拟线程,这个虚拟线程太强了SpringBoot4.0的基础就是从这里入手的,这样才能更好的支持百万级的并发。当然如果在实际开发中还在用JDK1.8进行性能优化,那估计这就跟你没啥关系了,作为一个开发者来讲咱首先得跟得上时代发展的步伐呀,不能稳定的抱着老版本不放。
// 在 Spring Boot 4 中启用虚拟线程的配置
// 这个配置在 application.yml 或者 application.properties 里写
// spring.threads.virtual.enabled=true
@Configuration
public class VirtualThreadConfig {
// 配置虚拟线程执行器,这玩意儿能大幅提升并发性能
@Bean
public Executor virtualThreadExecutor() {
// 创建虚拟线程执行器,底层用的是 Java 21 的虚拟线程
// 虚拟线程比传统线程轻量多了,一个线程池能支持百万级并发
// 这玩意儿比传统线程池强太多了,性能提升不是一点半点
return Executors.newVirtualThreadPerTaskExecutor();
}
}2、Spring Framework 7.0 集成
Spring Boot 4 基于Spring Framework 7.0进行了升级,这个也是Spring框架的一个大版本的更新。更新了包括如下的一些内容
- 声明式 HTTP 客户端(@HttpExchange)
- 更好的云原生支持
- 响应式编程增强
- API 版本控制
这些更新的内容在实际使用场景中也是比较方便的特别是在HTTP的客户端的访问上,比之前的调用都简单。如下所示。
// Spring Framework 7.0 引入的声明式 HTTP 客户端
// 这玩意儿比 RestTemplate 和 WebClient 用起来简单多了,代码量能减少 60%
@HttpExchange(url = "/api/users") // 定义基础 URL,所有方法都基于这个路径
public interface UserClient {
// 获取用户信息,方法签名就是接口定义,不用写实现;Spring 会自动生成代理
@GetExchange("/{id}") // GET 请求,路径参数是 id
User getUser(@PathVariable Long id); // 返回 User 对象,自动反序列化
// 创建用户,POST 请求,请求体是 User 对象;会自动序列化
@PostExchange
User createUser(@RequestBody User user);
}3、虚拟线程的支持
这个在前面的时候也提到了,这里详细来说说。虚拟机线程技术是JDK21引入的,Spring Boot4中对这个技术进行了深度的集成。对于传统的线程一个线程对应一个操作线程,资源消耗较大;而虚拟线程是轻量级的线程,一个JVM的线程中可以运行成千上万个虚拟线程。
这样一看这个虚拟线程技术确实非常厉害呀,之前我们需要小心翼翼的来维护线程池技术,现在直接交给虚拟线程就完事了。
// 虚拟线程的实际应用场景
@Service
public class UserService {
// 这个方法如果用传统线程,1000 个并发请求就得创建 1000 个线程;资源消耗太大了
// 用虚拟线程的话,可能只需要几个 JVM 线程就能搞定;这就是差距
public CompletableFuture<User> fetchUserAsync(Long id) {
// 虚拟线程会自动管理,不需要手动创建线程池;Spring Boot 4 都帮你搞定了
return CompletableFuture.supplyAsync(() -> {
// 模拟数据库查询,这里会挂起虚拟线程,不占用操作系统线程
// 虚拟线程挂起时,JVM 线程可以去执行其他虚拟线程,利用率贼高
return userRepository.findById(id);
});
}
}4、云原生的深度融合
Spring Boot4 在云原生的场景下也是下了很大的功夫,特别是与Kubernetes的集成,支持了Kubernetes探针、自动伸缩、服务网格等都进行了适配。
# application.yml 中配置 Kubernetes 探针
spring:
application:
name: my-app
kubernetes:
probes:
liveness:
enabled: true # 启用存活探针
path: /actuator/health/liveness # 探针路径
readiness:
enabled: true # 启用就绪探针
path: /actuator/health/readiness5、GraalVM原生镜像支持
Spring Boot 4 对GraalVM原生镜像的支持更加的完善。对于原生镜像来讲能够大幅度的提升启动的速度,减少了内存的占用,特别是在云原生场景中,在容器化部署的时候非常有用,启动快、内存省,真的就是为云原生量身定做的功能。
// 使用 GraalVM 编译原生镜像的配置
// 在 pom.xml 或者 build.gradle 中配置
// Maven 配置示例:
// <plugin>
// <groupId>org.springframework.boot</groupId>
// <artifactId>spring-boot-maven-plugin</artifactId>
// <configuration>
// <image>
// <builder>paketobuildpacks/builder:base</builder>
// </image>
// </configuration>
// </plugin>6、自动模块推导
JDK 9中引入了模块系统(JPMS)这个模块一直是后续版本的痛点,在很多的第三方库没有module-info.java;
但是在Spring Boot 4中则是引入了自动模块推导功能,能自动为这些库生成模块描述,解决90% 的模块化兼容问题。
这功能确实实用,以前搞模块化得一个个手动配置,现在自动搞定,省事多了。
7、分层编译优化
Spring Boot 4 支持分层JAR操作,开发者可以将应用拆解为依赖层、资源层和业务层;
通过这种方式在容器镜像中,可以做到依赖层的复用,这样的话镜像体积能减少 50%。
这功能对 Docker 镜像优化特别有用,依赖层基本不变,只有业务层变化时才需要重新构建,构建速度也快了不少。
// 分层 JAR 的结构
// 依赖层:第三方库,变化频率低,可以复用
// 资源层:静态资源,变化频率中等
// 业务层:业务代码,变化频率高
// 这样构建 Docker 镜像时,只有业务层变化才需要重新构建
8、Jackson 3 支持
在Spring Boot 4中对Jackson 3进行了全面的支持,这也是为啥要指定最低版本的JDK的原因之一。通过对Jaskson3的全面支持提升了序列化的性能,同时还支持了一些新的数据格式,比如 CBOR;
在IoT场景中对于数据处理的需求较敏感的场景中特别有用,因为CBOR格式比JSON更紧凑,传输效率更高。
// Jackson 3 的新特性使用示例
@RestController
public class DataController {
@Autowired
private ObjectMapper objectMapper; // Spring Boot 4 自动配置的是 Jackson 3
@GetMapping("/data")
public String getData() throws JsonProcessingException {
// Jackson 3 的序列化性能比 Jackson 2 提升了 20% 左右
return objectMapper.writeValueAsString(data);
}
}
9、测试框架增强
在Spring Boot 4中还引入了RestTestClient,通过这个客户端可以使得REST API的测试更加方便;同时对测试模块也进行了升级,例如JUnit Jupiter 6.0,使得测试功能更加强大。
在这之前测试REST API得用MockMvc,写起来比较麻烦,现在通过RestTestClient测试则是比较简单了代码减少了一半。
// RestTestClient 的使用示例
@SpringBootTest
class UserControllerTest {
@Autowired
private RestTestClient restTestClient; // 自动注入测试客户端
@Test
void testGetUser() {
// 测试 GET 请求,比 MockMvc 用起来简单
restTestClient.get()
.uri("/api/users/1")
.exchange()
.expectStatus().isOk()
.expectBody(User.class)
.value(user -> assertEquals("张三", user.getName()));
}
}
10、Spring AI 模块集成
在AI时代,Spring Boot 4中直接内置了Spring AI模块,我们可以方便地集成 AI 能力,比如调用大语言模型、向量数据库等;
// Spring AI 的使用示例
@Service
public class AIService {
@Autowired
private ChatClient chatClient; // AI 聊天客户端
public String chat(String prompt) {
// 调用 AI 模型,返回响应
return chatClient.call(prompt);
}
}
升级注意事项
如果你要对自己的项目从Spring Boot 3升级到Spring Boot 4,需要注意下面几点内容:
- JDK 版本必须升级:最低 Java 17,推荐 Java 21
- 依赖版本更新:很多第三方依赖可能需要升级到兼容 Spring Boot 4 的版本;这个比较麻烦,得一个个检查
- 配置属性变化:有些配置属性可能被废弃或改名,建议使用 spring-boot-properties-migrator 来检查
- API 变化:部分 API 可能有变化,需要检查代码兼容性
所以对于升级的事情来讲,还是需要在测试环境中稳定测试之后再上生产。
<!-- 添加属性迁移工具,帮助检查废弃的属性 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-properties-migrator</artifactId>
<scope>runtime</scope>
</dependency>
性能提升
Spring Boot 4 在性能方面有不少提升:
- 启动速度:使用 GraalVM 原生镜像,启动速度能提升 10 倍以上;
- 内存占用:原生镜像的内存占用能减少 50% 以上;
- 并发性能:虚拟线程支持百万级并发,比传统线程池强太多;
- 序列化性能:Jackson 3 的序列化性能提升 20% 左右;
性能提升这块确实给力,特别是原生镜像和虚拟线程,这两个特性加起来,性能提升不是一星半点的。
总结
Spring Boot 4 这次更新确实挺大的,从 JDK 版本要求到核心功能都有变化;如果需要升级,建议做好心理准备。可能得改不少代码。但是升级带来的性能提升和功能增强,还是挺值得的。
特别是虚拟线程和 GraalVM 原生镜像这两个特性,对性能提升帮助很大;如果你在做高并发应用或者云原生应用,Spring Boot 4 绝对值得一试。
好了,今天就聊到这;下一篇咱详细说说怎么从 Spring Boot 3 升级到 4,包括具体的迁移步骤和注意事项。