
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 Platform 和 Tanzu 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/
评论