智能体刷屏的背后,是 AI 应用拐点的来临?AICon 北京站议程重磅公布,50+ 硬核分享不容错过 了解详情
写点什么

Spring 团队谈 AOT 缓存处理、空值安全性和支持政策

作者:Karsten Silz

  • 2025-06-03
    北京
  • 本文字数:2319 字

    阅读完需:约 8 分钟

大小:1.11M时长:00:00
Spring团队谈AOT缓存处理、空值安全性和支持政策

Broadcom 最近发布了 Spring Boot 3.5多个 Spring 项目,并正在开发 Spring Framework 7.0 和 Spring Boot 4.0,计划于 2025 年 11 月发布。


Java 中的空值安全性正日益受到广泛关注。JEP Draft 8303099(非空受限和可空类型 (预览))目前仍在推进中,尚未成为即将发布的 JDK 版本的候选特性。与此同时,由谷歌(主导)、Spring、JetBrains 等成员组织共同参与的 JSpecify 计划为 Java 静态分析提供了标准注解。

InfoQ 采访了 Broadcom 的 Spring Framework 核心提交者 Sébastien Deleuze 和 Spring 团队开源支持总监 Michael Minella。他们回答了与处理 Java AOT 缓存、寻找支持 JSpecify 的库以及近期 Spring 支持政策变化相关的问题。


InfoQ:用户通常将 Spring Boot 应用程序作为存储在注册表中的容器镜像进行部署。然而,为了使用 Project Leyden 的 JEP 483 更快地启动应用程序,用户还必须为每个容器镜像存储和分发至少一个预编译(AOT)缓存文件。在这方面有哪些最佳实践?


Sébastien Deleuze: Spring Boot 在这方面非常灵活,它提供了一个 extract 命令来解包可执行 JAR 文件,可以与 Class Data Sharing (CDS) 或 AOT 缓存一起使用。


AOT 缓存很快将支持 JEP 515(提前方法分析)和 JEP Draft(提前代码编译)。为了生成有效的 AOT 缓存,分析数据应从具有实际工作负载的实例中获取,这些实例可能来自生产环境。AOT 缓存不一定需要包含在容器镜像中,这种集成很可能会发生在平台级别。例如,我们正在将 AOT 缓存与 Spring AOT 集成到 Tanzu PlatformTanzu Spring 中,实现 Spring 应用程序的自动优化。


在容器镜像中分发缓存方面,Spring Boot 使用开源的 Buildpacks 来创建容器镜像。它们可以自动使用 CDS 执行训练,并将生成的缓存文件包含在容器镜像中。AOT 缓存也可以通过这种方式进行分发。值得注意的是,与 OpenJDK Project CRaC 不同,CDS 和 AOT 缓存不会转储原始 Java 进程内存,从而有效避免了泄露敏感信息或密码的风险。一个推荐的最佳实践是使用一个专门的顶层容器层来存储 AOT 缓存,确保从应用层及以下都能充分利用缓存的优势。


InfoQ:JSpecify 计划定义了 Java 中空值安全性的语义,并标准化了 @Nullable@NonNull 等注解。从 Spring Boot 4.0 开始,所有 Spring 组合项目最终将使用 JSpecify。但是 Spring 开发者如何知道哪些非 Spring 库使用了 JSpecify?


Deleuze: 目前还没有一个权威的渠道来列出所有使用了 JSpecify 的库。不过,这确实是一个很有意义的想法,我们会将这个建议反馈给相关的工作组。在 Spring 之外,我们已经看到谷歌、Gradle 和 GraphQL 在他们的库中添加了 JSpecify 注解。


关于 JSpecify 的采用,有三个关键点:


首先,JSpecify 定义了三种空值类型:可空(@Nullable 注解)、非空(@NonNull 注解)和未指定(Java 默认行为)。Java 的默认行为适用于那些未明确声明其 API 空值语义的库。当混合使用空值安全(null-safe)和空值不安全(null-unsafe)代码时效果很好,尤其是当空值安全的 API 使用空值不安全的库时。


其次,粒度可以比整个库更具体。通常在包级别使用 @NullMarked 注解来声明默认采用非空类型,然后使用 @Nullable 明确标记可空类型。库可以用这种方式逐步增加空值安全性,甚至可以细化到类或方法级别


最后,JSpecify 正在努力更全面地定义 JDK 本身的空值语义,因为目前只有其 API 的一个子集指定了空值相关的信息。


InfoQ:Spring Boot 每个大版本的最后一个版本为长期支持(LTS)版本。2022 年 5 月发布的 Spring Boot 2.7 获得了 18 个月的免费更新(“开源支持”)和超过 4.5 年的付费更新(通过企业付费支持)。Spring Boot 3.5 将只获得 13 个月的免费更新,但付费更新将超过 7 年。这是出于何种考虑呢?


Michael Minella: 我们尽可能简化小版本升级,但由于大版本升级需要更大的投入,因此我们通常会给予更长的时间支持。例如,2022 年 5 月发布的 Spring Boot 2.7 提供了 18 个月的开源支持和15 个月企业支持。相比之下,Spring Framework 5.3,Spring Boot 2.7 的主要依赖项,提供了 50 个月的开源支持和24 个月企业支持。我们的政策在产品组合中没有保持一致,我们希望在这方面可以做得更好。


因此,我们在 2025 年 2 月更新了支持政策,做出两项重大调整。首先,所有支持时间线现在都与 Spring Boot 保持一致。在以往,产品组合中的支持时间线取决于发布日期——不同项目有不同的支持日期。在未来,用户只需要知道 Spring Boot 的支持日期:开源支持是在与之对应的 Spring Boot 发布之后的 13 个月,企业支持是在之后的 12 个月(都四舍五入到月底)。这一调整在整个产品组合中统一了支持期限,简化为两个支持时间线日期:6 月 30 日和 12 月 31 日。我们目前正在更新网站,使其更加清晰。


其次,我们制定了一个统一的 LTS 政策,而不是像以往那样每个项目各自为政:每个主要版本的最后一个次要版本(如 3.5)在 13 个月的开源支持和一年常规企业支持的基础上,额外获得五年的企业支持。这为用户提供了超过七年的总支持时间线,这是我们迄今为止提供的最长支持时间。


多年来,我们的社区一直明确表示,他们需要更多时间来进行大版本升级。通过提供更多的支持和简化流程,我们以最可持续的方式满足了社区的需求。根据到目前为止的反馈,社区对此表示认同。


开发者可以在这篇 InfoQ 新闻报道中了解有关空值限制和可空类型的更多信息,在这篇 InfoQ 新闻报道中了解 JSpecify 1.0.0。这篇 InfoQ 新闻报道描述了 JEP 483(提前类加载与链接),这是 Project Leyden 的第一个交付成果。


【声明:本文由 InfoQ 翻译,未经许可禁止转载。】


查看英文原文https://www.infoq.com/news/2025/05/spring-aot-jspecify-support/

2025-06-03 18:001

评论

发布
暂无评论

【刷题记录】3. 无重复字符的最长子串

WangNing

7月月更

5G NR 系统消息

柒号华仔

5G 7月月更

【深度学习】AI一键换天

逝缘~

人工智能 7月月更

接口测试要测试什么?

Xd

Java 后端 接口测试

每日一题——PAT乙级1002题

武师叔

7月月更

Http响应头处理

急需上岸的小谢

7月月更

LinkedBlockingQueue源码分析-新增和删除

zarmnosaj

7月月更

Binder核心API

北洋

binder 7月月更

第四期SFO销毁,Starfish OS如何对SFO价值赋能?

BlockChain先知

Ubuntu安装PyCharm

IT蜗壳-Tango

7月月更

玩转Sonar

sean77

牛客基础语法必刷100题之基本类型

京与旧铺

7月月更

java Reactive Streams响应式流式编程

字母哥哥

Java 响应式编程

redis你到底懂不懂之list

zxhtom

7月月更

接口测试进阶接口脚本使用—apipost(预/后执行脚本)

Xd

Java 数据库 接口测试工具

从Starfish OS持续对SFO的通缩消耗,长远看SFO的价值

股市老人

【愚公系列】2022年7月 Go教学课程 006-自动推导类型和输入输出

愚公搬代码

7月月更

kafka批量发送数据源码解析

字母哥哥

kafka 消息队列 源码解读

消息队列与快递柜之间妙不可言的关系

字母哥哥

消息队列

小程序多种开发方式对比-跨端?低代码?原生?还是云开发?

字母哥哥

小程序

C++中的STL库函数之万能图——map

KEY.L

7月月更

Java 9 缩小字符串( Compact String)

HoneyMoose

Service Mesh的基本模式

阿泽🧸

Service Mesh 7月月更

正则表达式

Jason199

正则表达式 js 7月月更

docker镜像分层原理及容器写时复制

字母哥哥

Docker 镜像

聊聊 Dart 的空安全 (null safety) 特性

岛上码农

flutter ios 安卓 跨平台开发 7月月更

Java多线程案例之任务定时执行器

未见花闻

7月月更

攻防演练中沙盘推演的4个阶段

穿过生命散发芬芳

7月月更 沙盘推演

Spring团队谈AOT缓存处理、空值安全性和支持政策_后端_InfoQ精选文章