一个被忽视的截止日期

2026 年 6 月 30 日,Spring Boot 3.5 正式停止维护(End of Life)。

这意味着什么?

运行 Spring Boot 3.5 的系统不再收到任何安全补丁。Spring Security 和 Spring Cloud Gateway 中已知的可利用漏洞将不再被修复。

而 Spring AI 2.0 GA 要求 Spring Boot 4.0+。

也就是说:如果你在用 Spring AI 2.0,你已经在 Spring Boot 4.0 上了。但如果你还在 3.x,你需要知道这个时间窗口已经关闭了。

为什么这不是”可以慢慢迁”的事

在 UberConf 2026 的安全议题中,有一个被反复强调的观点:

Spring Boot 3.5 EOL 不是一个”建议升级”通知,而是一个”安全暴露窗口已打开”的警告。运行未打补丁的 post-EOL 版本面临的是已文档化的、可利用的漏洞,且无法获得后续 CVE 修复。

这不是理论风险。Spring Security 和 Spring Cloud Gateway 的漏洞历史已经证明:公开的 CVE 在 EOL 后会被快速武器化。

迁移的 3 条路径

路径 1:3.5 → 4.0 直升(推荐)

适合:中小型项目,Spring AI 2.0 用户(本来就需要 4.0)

1
2
3
4
5
Spring Boot 3.5 → 4.0
Spring Framework 6.x → 7.0
Spring AI 1.x → 2.0
Jackson 2.x → 3.x(Spring Boot 4.0 默认)
JDK 17 → 21+(虚拟线程支持)

关键破坏性变化:

变化 影响 迁移策略
Jackson 3.x 默认 JSON 序列化行为变化 全量回归 API 响应格式
Spring Framework 7.0 HTTP Interface 变化 检查所有 HTTP 客户端声明
虚拟线程默认启用 线程池行为变化 测试 I/O 密集型端点的并发表现
Spring AI 2.0 API ChatClient / Advisor 变化 参考 Spring AI 2.0 升级清单

路径 2:3.5 → 3.5 Extended Support(过渡)

适合:大型项目,无法一次性迁移到 4.0

Spring Boot 3.5 的商业扩展支持提供有限的安全补丁,但:

  • 需要付费
  • 只有安全修复,没有功能更新
  • 最终还是要迁移到 4.0

这不是终点,是买了时间。

路径 3:3.4 及以下 → 4.0(高风险)

如果你还在 3.4 或更早版本,你已经在 EOL 之后了。迁移不能再拖。

Spring AI 2.0 用户的特殊注意

如果你已经在用 Spring AI 2.0,你已经在 Spring Boot 4.0 上了——但你的依赖可能没有跟上

检查清单

  1. Spring Cloud 版本:Spring Boot 4.0 要求 Spring Cloud 2025.x+。旧版 Spring Cloud 与 Boot 4.0 不兼容。

  2. Spring Cloud Alibaba 版本:Spring AI Alibaba 1.1.2.0+ 要求 Spring AI 2.0 + Spring Boot 4.0。确认你的 spring-cloud-alibaba 版本匹配。

  3. 数据库驱动

    • MySQL Connector/J 8.x → 9.x(MySQL 9.2 向量搜索需要)
    • 如果用了 VECTOR 类型,必须 9.x 驱动
  4. MQ 客户端

    • RocketMQ Spring Boot Starter 3.x → 3.1+(适配 Boot 4.0)
    • Kafka Spring 版本需与 Spring Boot 4.0 对齐
  5. ES 客户端:Spring Data ES 适配 Boot 4.0 的版本

  6. Jackson 3.x 迁移

    • 日期格式默认行为变化
    • @JsonInclude 默认值变化
    • 建议用 Jackson 3 的 JacksonAnnotationIntrospector 做兼容检查

一个容易被忽略的迁移坑:虚拟线程

Spring Boot 4.0 默认启用虚拟线程。这对 I/O 密集型的 Spring AI 应用是好事——LLM API 调用是典型的 I/O bound 场景。

但有两个注意:

1. ThreadLocal 污染

虚拟线程数量可以极大(百万级),但 ThreadLocal 会在每个虚拟线程上创建副本。如果你在 ThreadLocal 里存了大对象(如 Embedding 缓存),内存会爆。

1
2
3
4
5
// 危险:每个虚拟线程一份副本
private static ThreadLocal<List<Double>> embeddingCache = ThreadLocal.withInitial(...);

// 正确:用全局缓存
private static ConcurrentHashMap<String, List<Double>> embeddingCache = ...;

2. synchronized 块 pinning

虚拟线程在 synchronized 块里会 pin 住载体线程(carrier thread),降低并发。如果你的 RAG 检索路径有 synchronized:

1
2
3
4
5
6
7
8
9
// 危险:pin 住载体线程
public synchronized List<Document> retrieve(String query) { ... }

// 正确:用 ReentrantLock
private final ReentrantLock lock = new ReentrantLock();
public List<Document> retrieve(String query) {
lock.lock();
try { ... } finally { lock.unlock(); }
}

Spring AI 内部的 ChatClient 是线程安全的,不需要 synchronized。但如果你自定义了 Advisor 或 Memory,需要检查。

迁移决策树

1
2
3
4
5
6
7
你在 Spring Boot 几?
├── 4.0+ → ✅ 安全,检查依赖对齐
├── 3.5
│ ├── 有商业扩展支持 → 过渡,但制定 4.0 迁移计划
│ └── 无扩展支持 → 🔴 立即迁移到 4.0
├── 3.4 及以下 → 🔴 已 EOL,立即迁移
└── 不确定 → 检查 mvn dependency:tree | grep spring-boot

这意味着什么

Spring Boot 3.5 EOL 不只是一个版本号问题。它标志着:

  1. Spring 6 / Boot 3 时代的终结。Spring 7 / Boot 4 是新的基准线。
  2. **AI 时代的 Spring 是 4.0+**。Spring AI 2.0 不向下兼容 Boot 3.x,这意味着”先升级 Spring Boot,再上 Spring AI”——而不是反过来。
  3. 安全债务开始计息。每多跑一天 3.5,就多一天的已知漏洞暴露窗口。

参考链接