
A4 · Spring Boot 4 迁移清单——架构师的平滑升级作战手册系列2026 后端热点技术深读 · 主线 A「Java 后端演进」视角架构师选型 · 深度长文前情A1 虚拟线程 / A2 JDK 21·25 与 GC 选型 / A3 GraalVM 原生镜像与 AOT很多团队把 Spring Boot 4 当成又一个大版本——这是危险的错误。Boot 4 不是 3.x 的增量而是一次平台基线换血它绑死了 JDK 21、Jakarta EE 11、Spring Framework 7、Jackson 3并且把 Undertow、JUnit 4、Netflix 系声明式客户端的退路一并堵死。本文站在架构师视角给你一张可下发给团队的迁移作战手册哪些变更会真正打断编译、哪些只是配置平移、哪些其实是白送的能力红利以及一条不能跳级的升级路径。0. 为什么是现在而不是明年升级从来不是纯技术问题是时间窗口问题。老版本的安全补丁正在消失Spring Framework 6.2.x 的社区开源支持已于2026-06 终止不再有公开安全更新。停在 6.x 意味着你的底座在合规视角上已裸奔。官方缓冲带还在Spring Boot3.5.x 的支持期到 2026-11。这是你现在能安全停留的最晚版本——错过这个窗口再想升级就要面对更严重的技术债。新底座能力是对齐的Boot 4 SF 7 Jakarta EE 11 Java 21 是一套每个分层都对齐到同一 JDK、同一命名空间、同一可观测标准的连贯平台不是零散补丁。架构师决策新项目直接 Boot 4.0 JDK 21生产目标取 JDK 25存量项目先升到 3.5.x 吃满安全补丁再把 4.0 列入 Q 计划。1. 升级路径两跳不可跳级Boot 4 破坏性太大不允许 3.1 → 4.0 这种跨代直跳。官方与社区验证过的稳妥路径只有一条3.x任意──▶ 3.5.x过渡安全补丁到 2026-11──▶ 4.0.x要点先到 3.5.x 并充分测试把 Jakarta EE 9→10 的过渡、依赖升级先消化掉Kotlin 项目需同步升到Kotlin 2.2Boot 4 对 Kotlin 编译器版本有硬要求工具链用 Java 21 toolchain 锁定避免本地 JDK 漂移导致构建不一致!-- pom.xml --propertiesjava.version21/java.version/properties// build.gradle java { toolchain { languageVersion JavaLanguageVersion.of(21) } }关于最低 JDKSpring Boot 4 官方运行门槛为Java 17与 Spring Framework 7 对齐但生产实践基线应取 Java 21——虚拟线程、ScopedValue、Project Leyden 启动优化均需 21且Java 25 是 2026 推荐生产目标。低于 21 跑 Boot 4 等于阉割版。2. 六大破坏性变更按杀伤力排序2.1 Jakarta EE 11javax.*→jakarta.*影响面最大Boot 3 把javax改成jakarta是桌面级Boot 4 直接强制 Jakarta EE 11。第三方库若还没完成迁移在 Boot 4 下直接无法工作——这是生态里最常见的隐藏断裂点。受影响的核心包旧javax新jakartajavax.servlet.*jakarta.servlet.*javax.persistence.*jakarta.persistence.*javax.validation.*jakarta.validation.*javax.annotation.*jakarta.annotation.*javax.transaction.*jakarta.transaction.*javax.websocket.*jakarta.websocket.*javax.mail.*jakarta.mail.*自动化迁移别手改覆盖 99% 场景mvn rewrite:run\-Drewrite.activeRecipesorg.openrewrite.java.migrate.jakarta.JavaxMigrationToJakarta陷阱清单这些javax.*是 JDK 自带、不能改改了反而编译不过javax.crypto.* javax.net.* javax.security.* javax.xml.*部分迁移后自检grep-rjavax\.src/main/java/--include*.java\|grep-vjavax.crypto\|javax.net\|javax.security# 应为空2.2 虚拟线程成为默认线程模型Boot 4 里所有异步任务、HTTP 请求处理、定时任务默认走虚拟线程。这把 A1 讲的免费午餐变成了出厂设置——但你得确认代码里没有synchronized导致的载体线程 pinning见 A1否则反而抵消收益。2.3 Undertow 出局Servlet 6.1 不支持Jakarta EE 11 要求Servlet 6.1而 Undertow 2 不支持、Undertow 3 长期未正式发布结果就是Boot 4 移除了 Undertow。还在用 Undertow 的升级前先切到Tomcat 11或Jetty 12.1受影响范围spring-boot-starter-undertow直接失效构建期即报错。2.4 Jackson 3包名整体搬家Boot 4 自带Jackson 3根包从com.fasterxml.jackson.*改为tools.jackson.*且异常体系重构。自定义JsonSerializer/JsonDeserializer、直接 new 的ObjectMapper、硬编码的 Jackson 包引用都要改用 Spring 注入的ObjectMapper推荐基本无感问题集中在自己 new Jackson 对象的老代码。// 旧Jackson 2importcom.fasterxml.jackson.databind.ObjectMapper;// 新Jackson 3importtools.jackson.databind.ObjectMapper;2.5 JUnit 4 静默死亡Boot 4移除了junit-vintage-engine桥接。后果很阴险JUnit 4 测试不会报错而是静默不跑——你看 CI 绿了其实老测试一个没执行。所有Testorg.junit.Test必须迁到JUnit 5Jupiterorg.junit.jupiter.api.Test迁移后务必核对测试数量是否对得上别被绿勾骗了。2.6 依赖基线大跃迁一张表对齐组件Boot 4 基线Spring Framework7.0.xSpring Security7.0.xSpring Data2026.0.0MyBatis Plus≥ 3.5.8Lombok≥ 1.18.36FastJSON2≥ 2.0.58MySQL Connector/J≥ 8.4.0Redis Client≥ 7.2.5任一低于此线的依赖先升版本再升 Boot避免编译期一堆NoSuchMethod/ClassNotFound。3. 白送的能力红利架构师最该向上宣讲的破坏性变更是要付出的代价下面这些才是升级的理由。3.1 原生弹性注解甩掉 Resilience4j / GuavaSpring Framework 7 把Retryable、ConcurrencyLimit、CircuitBreaker直接内置于容器AOP 实现且保留调用线程的安全上下文、链路追踪上下文与 ScopedValue。这正是外部容错库的老痛点它们的重试线程不携带调用方上下文破坏分布式追踪和安全传播。内置实现天然没有这个问题。ServicepublicclassReportService{// 最多 5 个并发报表生成保护线程预算不被慢接口打爆ConcurrencyLimit(5)publicReportgenerateAnnualReport(StringtenantId){returnreportEngine.buildAnnual(tenantId);// CPU 密集长任务}Retryable(maxAttempts3)CircuitBreaker(failureRateThreshold50)publicOrderconfirm(Ordero){/* ... */}}决策新项目直接用内置注解存量项目可逐步用内置替换 Resilience4j不必一次性推翻。3.2 可观测性开箱即用OTLPBoot 3 里可观测是配置题——要手动接 Brave / OpenTelemetry 桥、配 tracer bean、保证 trace 在Async/ RestTemplate / 响应式链里传播。Boot 4 改成默认原生 OTLP 输出# application.yml —— Boot 4 原生 OTLP开箱即用management:otlp:tracing:endpoint:http://otel-collector:4318/v1/tracesmetrics:export:url:http://otel-collector:4318/v1/metricsMicrometer 仍是抽象层但 trace/metric 导出从手搓变成填地址。这把 A 线的可观测叙事和 C 线 OpenTelemetry 直接打通。3.3 JSpecify 空安全编译期校验全框架内置Nullable/NonNull标准化注解IDEA 可全局静态检测空指针。隐式空值隐患在编译期就被拦下这是长期降低 NPE production 事故率的结构性收益。3.4 模块化 Bean 注册 Spring ModulithBeanRegistrar支持模块化批量注册 Bean替代大量Conditional冗余配置天然适配 Spring Modulith 领域模块化架构——给适度微服务C 线⑬在单体内的落地提供了官方路径。4. 声明式 HTTP 客户端Feign → HTTP Interface这是用户原计划里的核心卖点也是存量项目最常踩的坑。为什么弃 FeignSpring Cloud 早已将OpenFeign 移入维护模式官方长期推荐用声明式 HTTP Interface基于RestClient/WebClient替代。Boot 4 Spring Cloud 2025.0 时代新项目不该再引入 Feign。迁移示例// 旧Feign 客户端FeignClient(nameorder-svc,url${order.svc.url})publicinterfaceOrderClient{GetMapping(/orders/{id})OrdergetOrder(PathVariable(id)Longid);}// 新声明式 HTTP InterfaceSpring 原生零额外依赖publicinterfaceOrderClient{GetExchange(/orders/{id})OrdergetOrder(PathVariableLongid);}ConfigurationpublicclassClientConfig{BeanpublicOrderClientorderClient(RestClient.Builderbuilder){returnHttpServiceProxyFactory.builderFor(builder.baseUrl(${order.svc.url}).build()).build().createClient(OrderClient.class);}}对比决策表维度Feign维护模式HTTP Interface推荐额外依赖spring-cloud-starter-openfeign无Spring 原生底层客户端自带 / OkHttpRestClient可配 JDK/Apache/Jetty虚拟线程友好需额外适配天然兼容可观测集成手动接Micrometer 原生维护状态仅维护、不新增特性一线演进架构师口径新项目一律 HTTP Interface存量的 Feign 可随业务改造逐步替换不必为升级 Boot 4 强行一次性重构Feign 在维护模式下仍能跑只是不是未来。5. AOT / GraalVM 迁移核对表回扣 A3Boot 4 的 AOT 编译比 3.2快约 40%且支持更多 Spring 特性条件注解、ConfigurationProperties、Scheduled等。若你已按 A3 规划做原生镜像迁移时核对反射/代理声明自定义动态反射、序列化、JNI 仍需在RuntimeHints中声明Spring AOT 引擎会在构建期干跑上下文自动生成大多数提示构建平台原生构建在 Linux 容器内CI Buildpacks进行保证与部署平台一致条件化 Bean确认Profile/ConditionalOnProperty在 AOT 下行为一致避免构建期上下文与运行期不一致测试原生镜像的测试用nativeTest任务普通 JVM 测试无法覆盖原生约束。优先级建议先完成 JVM 模式下的 Boot 4 迁移并稳定再开启 GraalVM 原生镜像A3。两步合一风险过高。6. 迁移作战手册7 步落地 回退落地顺序锁工具链JDK 21 toolchainMaven/GradleCI 镜像同步升到 3.5.x先吃满安全补丁跑通全量测试尤其确认 JUnit 4 已迁 Jupiter测试数量对得上跑 OpenRewriteJavaxMigrationToJakarta自动迁移再人工核对javax.crypto/net/security例外切 Servlet 容器Undertow → Tomcat 11 / Jetty 12.1升依赖基线按 §2.6 表对齐所有第三方版本改破坏性点Jackson 3 包名、JUnit 4 静默失效、自定义ObjectMapper、Feign→HTTP Interface按需升 Boot 4.0编译 全量测试 灰度发布。回退策略每步独立提交、独立可回退3.5.x 阶段保持生产可发布Boot 4.0 用灰度/影子流量验证后再全量保留 3.5.x 分支到 2026-11作为安全补丁兜底。迁移前自检清单JDK 21 toolchain 已锁定CI 镜像一致已升 3.5.x 且全量测试通过JUnit 4 → Jupiter 完成测试数量核对一致无残留javax.servlet/persistence/validation除 JDK 自带例外Undertow 已替换第三方依赖达 §2.6 基线Jackson 自定义序列化已改包名Feign 存量评估完毕新代码已转 HTTP Interface可观测 endpoint 已切 OTLP7. 架构师决策建议收尾新项目Boot 4.0 JDK 21生产取 25 Tomcat 11 HTTP Interface OTLP一步到位现代底座存量项目3.5.x 缓冲 → 4.0 灰度破坏性变更按 §2 逐个消化弹性/可观测红利§3随升级自然获得风险排序Jakarta 迁移 依赖基线 Undertow Jackson 3 JUnit 4 Feign最大误区把 Boot 4 当小版本。它是平台换血必须走两跳路径、配回退、用 OpenRewrite。A 线结语A1 虚拟线程、A2 JDK/GC、A3 GraalVM 原生、A4 Spring Boot 4——四条线合起来就是 2026 年 Java 后端确定性最强的一组底座升级。它们彼此咬合虚拟线程需要 JDK 21原生镜像需要 AOT而 Boot 4 把三者拧成出厂默认。下一篇切入 B 线《AI 工程化》当底座稳了增量最大、ROI 最高的战场在 AI——从架构优先于模型讲起。本篇为系列第 4 篇A 线收官。配套文件01-虚拟线程落地-架构师选型.md、02-JDK21-25升级与GC选型.md、03-GraalVM原生镜像与AOT.md。