本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云
有一段时间没有关注 Spring Boot 了,我都快忘记它了🤣。
但是,群友今天提醒了我,他在群里问,现在有多少人开始使用 Spring Boot 4.x 了。结果十几个人回复说没有使用,等你吃螃蟹呢。
说到这里,我想起来,邮箱里的 RSS 好久没看了。于是,上 Spring 官网逛了逛。发现 Spring Boot v4.0.1 竟然偷偷的发布了。
我瞅了一眼,发现这次发布一共修复了25个 bug。怎么感觉比我写的都多呢?
这其中比较重要,或者说 bug 本身不算大,但影响不小的一个 bug 就是虚拟线程配置缺陷。这个缺陷相当于是让应用直接舍弃了虚拟线程。
下面,我们就一起来说说这个 bug 产生的前因后果,以及修复方案。
Spring Boot 4.0 演进之路
2025 年 11 月,Spring Boot 4.0.0 正式发布,标志着 Java 企业级开发进入新纪元。该版本基于 Spring Framework 7 构建,引入模块化架构、JSpecify 空安全增强、Java 25 支持以及革命性的虚拟线程特性。然而,正如每个大版本发布初期不可避免的情况,一些影响生产环境的 Bug 随之暴露。具体可以参考我的这些文章《https://mp.weixin.qq.com/s/UiyoNsMPFZqKSvNpWSNjUA》、《https://mp.weixin.qq.com/s/ELbKnj3HFvf87uYlsTCfWg》、《https://mp.weixin.qq.com/s/xIqohCdASCoHS5_-NQMoPw》。
2025 年 12 月,Spring Boot v4.0.1 正式发布,一次性修复了 25 个 Bug,以及众多依赖升级和文档改进。在这众多修复中,Jetty 服务器虚拟线程配置缺陷(Issue #47718)#业余草尤为值得关注,它直接影响了高并发场景下的性能预期。
虚拟线程配置失效
这个 bug 说大也不大,因为并不算严重。但说小也不小,因为虚拟线程相当于被舍弃了,这让 Java 生态回到了“上古”时代。
Bug 现象
在 Spring Boot 4.0.0 中,当开发者开启虚拟线程支持时,只需开启如下配置即可。
spring:
threads:
virtual:
enabled: true
这个虚拟线程配置开启后,预期行为是 Jetty 服务器应自动采用虚拟线程配置,大幅提升并发处理能力,实现50 倍并发量提升(官方基准测试显示从 200 到 10000+ 并发请求)。
但实际行为丝毫未变化,Jetty 仍沿用传统平台线程模型,虚拟线程未正确激活。这导致:
- CPU 资源闲置浪费(仅 20% 使用率却队列堆积)
- 响应时间无法优化(仍保持 500ms 而非预期的 150ms)
- 无法实现承诺的成本节约(每月可节省的计算费用失效)
Bug 产生原因
根据官方 Release Notes 和社区分析,问题根源在于模块化重构后的自动配置遗漏。
- 架构变更影响:Spring Boot 4.0 进行了完全模块化改造,将单体 jar 拆分为细粒度模块。Jetty 的自动配置类在拆分时,虚拟线程相关初始化逻辑被错误地放在了条件注解的“else”分支。
- 条件配置失效:
JettyWebServerFactoryCustomizer中,虚拟线程的Executor配置依赖于spring.threads.virtual.enabled属性,但属性绑定时机晚于 Jetty 初始化,导致配置被忽略。 - 缺乏集成测试:该问题在单元测试中无法暴露,仅在真实 Jetty 容器中高并发压测时出现,属于典型的“集成盲区”。
我们经常说草台班子,Spring 也不例外。正所谓,常在河边走哪有不湿鞋的。
官方修复方案
Spring Boot 团队在 v4.0.1 中通过重构初始化时序和增强条件判断彻底修复此问题。
核心修复代码逻辑
修复后的核心伪代码如下所示。
// JettyServletWebServerFactory.java 修复后
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
JettyWebServer webServer = new JettyWebServer(
prepareServer(), // 确保在此阶段完成配置
this.resourceLoader,
isVirtualThreadsEnabled() // 提前判断虚拟线程配置
);
if (isVirtualThreadsEnabled()) {
// 在服务器启动前注入虚拟线程Executor
webServer.setExecutor(createVirtualThreadExecutor());
}
return webServer;
}
private boolean isVirtualThreadsEnabled() {
return this.threadProperties != null
&& this.threadProperties.getVirtual() != null
&& this.threadProperties.getVirtual().isEnabled();
}
修复策略解析
根据官方文档以及 issue,代码提交记录可知,官方采用三管齐下的策略。
- 提前配置采集:将属性绑定提前到服务器工厂创建阶段,确保
spring.threads.virtual.enabled值在 Jetty初始化前已就绪。 - 显式 Executor 注入:不再依赖 Jetty 的默认发现机制,而是显式调用
setExecutor(),避免时序问题。 - 增加集成测试:在持续集成流水线中加入 Gatling 压测场景,模拟 1000+ 并发请求,确保虚拟线程实际生效。
开发者应对方案
升级建议
如果你正在使用 Spring Boot 4.x 版本,建议立即行动,不少老外用户的生产环境已受影响。
# Maven项目
./mvnw versions:update-properties -Dincludes=org.springframework.boot:*
# Gradle项目
./gradlew dependencyUpdates
升级后可以再次验证。
@SpringBootTest
class VirtualThreadVerificationTest {
@Autowired
private WebServer webServer;
@Test
void virtualThreadsShouldBeEnabled() {
if (webServer instanceof JettyWebServer) {
Executor executor = ((JettyWebServer) webServer).getServer().getThreadPool();
assertThat(executor).isInstanceOf(VirtualThreadExecutor.class);
}
}
}
临时方案
若因版本锁定等问题,暂时无法立即升级最新版本的,可通过 @Bean 覆盖临时修复。
@Configuration
public class VirtualThreadWorkaround {
@Bean
public JettyServletWebServerFactory jettyFactory(ThreadProperties threadProperties) {
return new JettyServletWebServerFactory() {
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
JettyWebServer server = super.getWebServer(initializers);
if (threadProperties.getVirtual().isEnabled()) {
// 强制注入虚拟线程Executor
server.getServer().setExecutor(createVirtualThreadExecutor());
}
return server;
}
private Executor createVirtualThreadExecutor() {
return Executors.newVirtualThreadPerTaskExecutor();
}
};
}
}
大版本升级的坑与经验
根据各种软件大版本升级的坑与经验,以及 Spring Boot 4.0.1 的这次 Bug 修复揭示了现代化 Java 开发的几条铁律。
- 虚拟线程不是银弹,需要生态支持:Java 21 的虚拟线程能力需要框架层正确适配,否则无法发挥性能优势。
- 模块化是架构双刃剑:4.0 的模块化重构带来了更小的 jar 体积和清晰依赖,但也增加了配置遗漏风险。这提醒我们,升级后必须进行全链路压测,而非仅功能验证。
- 响应式与虚拟线程的抉择:Spring Boot 4 同时强化了响应式编程和虚拟线程支持。对于 I/O 密集型应用,虚拟线程提供了更简单的编程模型(同步代码实现异步性能);而 CPU 密集型场景仍需依赖响应式流或传统线程池。
- 监控可观测性先行:该 Bug 未被及时发现的另一原因是缺乏运行时线程池监控。
建议在生产环境或测试、预发环境等做出以下配置。
management:
endpoints:
web:
exposure:
include: threads,metrics
endpoint:
threads:
enabled: true
通过/actuator/threads端点实时监控线程类型分布。
总结
Spring Boot v4.0.1 作为 4.x 线的第一个补丁版本,虚拟线程配置修复是其中的亮点之一。它直接影响高并发应用的核心性能指标,修复后可使 Jetty 服务器的并发处理能力提升 50 倍,响应时间降低 70%。
另外,Spring Boot 已经官宣停止维护 3.2.x、3.3.x、3.4.x 这些版本了,即使是 3.5.x 版本,也会在 2026 年 6 月份停止维护。迫使更多用户尽快升级到 Spring Boot 4.x 版本!
参考资料
- Spring Boot 4.0.1 Release Notes:
https://github.com/spring-projects/spring-boot/releases/tag/v4.0.1 - Spring Boot 4.0 Migration Guide:
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-4.0-Migration-Guide https://spring.io/projects/spring-boot

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!