题为“2026 年 9 月 22 日的 This Week in Spring”的内容指向一次 Spring 生态周度盘点,但给定摘要没有列出具体发布版本、修复项或新功能。因此,与其猜测这一周更新了什么,不如建立一套可重复的验证流程:确认版本、生成最小项目、检查依赖树,再用测试和运行时端点判断升级影响。
周报里的版本号只是起点
Spring 生态并不是一个单体项目。一次周报可能同时涉及 Spring Boot、Spring Framework、Spring Data、Spring Security、Spring Cloud,以及各类集成项目。看到新版本时,需要先回答三个问题:
- 它是正式版、里程碑版还是候选版?
- Spring Boot 的依赖管理是否已经纳入这个版本?
- 当前项目依赖的是该组件本身,还是由其他 starter 间接引入?
不要因为某个 Spring Framework 版本已经发布,就直接在 Boot 项目里覆盖其版本。Spring Boot 的 BOM 会管理一组经过组合验证的依赖;手工覆盖底层组件,可能让编译继续通过,却在运行时遇到方法签名不匹配或自动配置失效。
在 Maven 项目中,可以先查看实际解析出来的 Spring 依赖:
./mvnw dependency:tree \
-Dincludes=org.springframework,org.springframework.boot,org.springframework.security
Gradle 项目可以执行:
./gradlew dependencies --configuration runtimeClasspath
关注最终解析版本,而不仅是 pom.xml 或 build.gradle 中显式写出的版本。很多关键依赖来自 BOM、starter 或传递依赖。
建一个一次性的验证项目
下面的流程会通过 Spring Initializr 创建一个最小 Web 与 Actuator 项目。它默认采用生成服务当前提供的稳定基线,因此不需要在文章中硬编码一个可能很快过期的 Spring Boot 版本。
运行前请确保本机安装了 JDK、curl 和 unzip:
rm -rf weekly-check weekly-check.zip
curl -fsSL 'https://start.spring.io/starter.zip' \
--get \
--data-urlencode 'type=maven-project' \
--data-urlencode 'language=java' \
--data-urlencode 'groupId=dev.example' \
--data-urlencode 'artifactId=weekly-check' \
--data-urlencode 'name=weekly-check' \
--data-urlencode 'packageName=dev.example.weeklycheck' \
--data-urlencode 'dependencies=web,actuator' \
-o weekly-check.zip
unzip -q weekly-check.zip -d weekly-check
cd weekly-check
./mvnw test
接着加入一个最小接口:
mkdir -p src/main/java/dev/example/weeklycheck
cat > src/main/java/dev/example/weeklycheck/VersionController.java <<'JAVA'
package dev.example.weeklycheck;
import org.springframework.boot.SpringBootVersion;
import org.springframework.core.SpringVersion;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
@RestController
public class VersionController {
@GetMapping("/versions")
Map<String, String> versions() {
return Map.of(
"springBoot", valueOrUnknown(SpringBootVersion.getVersion()),
"springFramework", valueOrUnknown(SpringVersion.getVersion()),
"java", System.getProperty("java.version")
);
}
private String valueOrUnknown(String value) {
return value == null ? "unknown" : value;
}
}
JAVA
./mvnw spring-boot:run
另开一个终端进行验证:
curl -fsS http://localhost:8080/versions
printf '\n'
curl -fsS http://localhost:8080/actuator/health
printf '\n'
这个项目不是对该期周报内容的复现,因为来源摘要没有提供具体更新项;它是一块干净的试验田。拿到明确版本后,可以在独立分支中调整父 POM 或插件版本,然后重复执行测试和依赖检查。
把“能启动”升级为“可以采用”
应用成功启动只能证明最浅的一层兼容性。评估一次 Spring 升级时,建议至少覆盖以下检查:
- 编译与单元测试:运行
./mvnw clean verify,不要只执行启动命令。 - 依赖差异:升级前后保存
dependency:tree输出并进行比较,特别关注日志、JSON、Netty、Servlet 容器和安全组件。 - 自动配置变化:启动时临时加入
--debug,检查条件评估报告中新增或消失的配置。 - 配置属性迁移:确认旧属性是否废弃、重命名或改变默认值。
- 运行时路径:覆盖数据库连接、序列化、认证授权、消息消费与定时任务等真实路径。
- 可观测性:检查健康端点、指标名称、追踪数据和日志格式是否变化。
可以把升级前后的依赖树保存下来:
./mvnw dependency:tree -DoutputFile=dependencies-before.txt
# 修改 Spring Boot 或相关组件版本后再次执行
./mvnw clean verify
./mvnw dependency:tree -DoutputFile=dependencies-after.txt
diff -u dependencies-before.txt dependencies-after.txt || true
如果项目使用 Spring Security,还应加入未认证、普通用户和管理员三类请求测试。安全链的默认行为变化,往往比编译错误更难在早期被发现。
团队采用时的边界
对于周报中出现的里程碑版或候选版,可以放入实验分支验证,但不应仅凭“新版本可用”就进入生产环境。正式采用前建议完成这份清单:
- 已确认发布级别和 Java 最低版本;
- 已阅读目标组件的发布说明与迁移说明;
- 没有无依据地覆盖 Spring Boot 管理的依赖;
- 核心集成测试在与生产接近的环境中通过;
- 镜像、启动参数和监控规则已经验证;
- 已准备清晰的回滚版本与数据库兼容策略。
Spring 周报最有价值的用法,不是收集更多版本号,而是尽快把变化转化成一个小型、隔离、可以失败的实验。来源没有给出具体更新细节时,应明确保持克制;等到版本与变更列表可核实时,再让数据、测试和依赖树决定是否升级。