应用升级前的风险核查在推动 Spring Boot 框架大版本升级例如从 2.7.x 平滑演进至 3.x或搭配 JDK 17/21 运行时时许多工程团队常把升级误认为“改一下pom.xml里的spring-boot-starter-parent版本号”。然而在编译期或应用启动阶段系统往往会迎来铺天盖地的ClassNotFoundException、NoSuchMethodError以及自动配置Auto-Configuration失效。从源码底层来看Spring Boot 3.x 不仅强制要求 JDK 17 和 Servlet 5.0/6.0 规范而且彻底改变了底层 SPI 自动配置加载机制删除了大量的过时类。如果升级前未对底层变化做足风险评估极其容易引发线上服务启动失败或隐蔽的运行时异常。1. 源码级解析自动配置 SPI 机制的断代式变更在 Spring Boot 2.x 中自定义 Starter 或第三方组件的自动配置类统一写在META-INF/spring.factories文件中底层由SpringFactoriesLoader负责读取解析。而在 Spring Boot 3.x 中这一机制被彻底重构。底层AutoConfigurationLoader不再扫描spring.factories里的EnableAutoConfiguration键值对转而直接读取META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件。如果自研的 SDK 未做调整升级后所有的自定义 Bean 均无法被 Spring 容器扫描注入。升级时应为自定义 Starter 补充全新的 SPI 声明配置文件# 文件路径src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports # 直接按行书写全限定类名无需 keyvalue 格式 com.example.boot.config.CustomMetricsAutoConfiguration com.example.boot.config.CustomResilienceAutoConfiguration适配 Spring Boot 2.7 与 3.x 双版本的 AutoConfiguration 源码示例package com.example.boot.config; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.slf4j.Logger; import org.slf4j.LoggerFactory; AutoConfiguration // Spring Boot 3.x 推荐使用 AutoConfiguration 替代 Configuration ConditionalOnProperty(prefix custom.feature, name enabled, havingValue true, matchIfMissing true) public class CustomMetricsAutoConfiguration { private static final Logger log LoggerFactory.getLogger(CustomMetricsAutoConfiguration.class); Bean ConditionalOnMissingBean public CustomMetricsCollector customMetricsCollector() { log.info(初始化 Spring Boot 3.x 兼容的自定义指标收集器 Bean); return new CustomMetricsCollector(); } } class CustomMetricsCollector { public void collect() { // 采集逻辑 } }2. 包名变迁javax.*到jakarta.*的全面替换Spring Boot 3.x 依赖 Jakarta EE 9 规范这意味着所有基于 Java EE 的 API 包名全部由javax.*变更为了jakarta.*。以下关键包名应全量替换javax.servlet.*➔jakarta.servlet.*javax.persistence.*➔jakarta.persistence.*(JPA/Hibernate 6)javax.validation.*➔jakarta.validation.*(Hibernate Validator)javax.annotation.*➔jakarta.annotation.*在 MyBatis-Plus、Spring Security 或 JPA 混合使用的工程中如果遗留了三方库对javax.servlet.HttpServletRequest的强依赖编译期不会报错但运行时会在 Filter 链中抛出ClassCastException。3. 依赖树冲突与类加载诊断命令升级大版本时最常见的问题是传递依赖带入了旧版javax.*或旧版 Spring 5.x 的 Jar 包。可以通过 Maven 命令行诊断全局依赖树定位引入冲突 Jar 包的具体路径# 扫描依赖树中是否仍遗留 spring-framework 5.x 或 javax.servlet 依赖 mvn dependency:tree -Dincludesorg.springframework:*:5.*,javax.servlet:*输出定位示例[INFO] com.example:order-service:jar:1.0.0 [INFO] \- com.thirdparty:old-sdk:jar:2.1.0:compile [INFO] \- javax.servlet:javax.servlet-api:jar:4.0.1:compile (冲突源头)发现冲突源后在pom.xml中使用exclusions排除旧依赖并显式引入支持 Jakarta EE 的新版 SDK。同时利用 OpenJDK 的命令行诊断工具检查运行时类加载源确认类文件加载路径是否为预期版本# 诊断应用运行期 jakarta.servlet.Filter 来自哪一个 jar 包 jcmd $(pgrep -f order-service) VM.class_hierarchy | grep -i Servlet4. 运行时 API 行为变更RestTemplate缓冲区与 Timeout在 Spring Boot 3.x 中默认的 HTTP 客户端工厂及RestTemplate的底座超时配置有所收紧。例如旧版SimpleClientHttpRequestFactory允许无限缓冲大响应而新版在未指定连接池时更容易触发ClientHttpRequestFactory的连接超时。在配置类中推荐通过 Spring Boot 3.x 提供的RestClient或明确的连接池配置重新注册 Beanpackage com.example.boot.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.client.SimpleClientHttpRequestFactory; import org.springframework.web.client.RestClient; import org.springframework.web.client.RestTemplate; import java.time.Duration; Configuration public class HttpClientConfig { Bean public RestTemplate restTemplate() { SimpleClientHttpRequestFactory factory new SimpleClientHttpRequestFactory(); factory.setConnectTimeout((int) Duration.ofSeconds(3).toMillis()); factory.setReadTimeout((int) Duration.ofSeconds(10).toMillis()); return new RestTemplate(factory); } Bean public RestClient restClient(RestClient.Builder builder) { // Spring Boot 3.2 推荐使用的同步 Fluent HTTP 客户端 return builder .requestFactory(new SimpleClientHttpRequestFactory()) .baseUrl(http://api.internal) .build(); } }梳理 SPI 配置文件、全量替换jakarta.*包名、严格排查传递依赖并规范 HTTP 客户端才能在 Spring Boot 升级过程中避开隐藏陷阱确保系统高效稳定运转。