Spring Framework 6.2 和 Spring Boot 3.4 为 2025 年新一代做好准备
wptr33 2024-12-13 16:38 10 浏览
VMware 于 2024 年 11 月发布了Spring Framework 6.2和Spring Boot 3.4,保持了 Java 17 和 Jakarta EE 9 的基准。Spring Boot 3.4 具有结构化日志记录,为 Docker Compose 和 Testcontainers 添加了各种容器镜像,并改进了容器镜像构建和执行器。VMware 还宣布将于 2025 年 11 月发布 Spring Framework 7 和 Spring Boot 4,它们将保留 Java 17 但迁移到 Jakarta 11,采用JSpecify 实现空安全,并使用 Project Leyden加快应用程序启动速度。InfoQ 就这些 2025 年版本采访了 Spring Framework 项目负责人 Juergen Hoeller 和 Spring Framework 核心提交者 Sébastien Deleuze。
在结构化日志记录中,日志输出具有明确定义、通常为机器可读的格式。Spring Boot 支持 Elastic Common Schema (ecs)、Logstash (logstash) 和 Graylog Extended Log Format (gelf) 格式。设置logging.structured.format.file为这三个值之一将启动结构化文件日志记录,而logging.structured.format.console定义结构化控制台日志记录格式。
Docker Compose 可以通过新属性spring.docker.compose.start.arguments和接收命令行参数spring.docker.compose.stop.arguments并处理 POSTGRES_HOST_AUTH_METHOD=trust环境变量。Spring Boot 为 Docker Compose 和 Testcontainers 添加了各种容器镜像:带有和redis/redis-stack的Redis Stack 和 Redis Stack Server、带有redis/redis-stack-server和Testcontainers类的Grafana LGTM。Testcontainers现在支持带有类的 Kafka 。grafana/otel-lgtm LgtmStackContainer KafkaContainer
现在,使用来自不受信任来源的构建器构建 OCI 映像会更加安全(请参阅Maven和GradletrustBuilder的文档)。该选项可以为与主机平台不同的操作系统和架构构建容器映像。现在,JVM 应用程序的默认 Cloud Native Buildpacks 构建器是,这应该会产生更小的映像。它开箱即用地支持 ARM 和 x64。imagePlatformpaketobuildpacks/builder-jammy-java-tiny
新的只读执行器访问模式加入了两个现有的重命名模式,分别为“无限制访问”(已启用)和“无访问”(已禁用)。这就是为什么management.endpoints.enabled-by-default被称为management.endpoints.access.default,并且management.endpoint.<id>.enabled是 management.endpoint.<id>.access。 下的新执行器端点/actuator/info显示 SSL 信息,包括即将过期的证书。/scheduledtasks端点显示有关计划任务的更多信息,例如“下一个计划执行时间”和“上次执行时间、状态和异常”。
嵌入式 Web 服务器现在默认正常关闭。设置server.shutdown为immediate可撤销该更改。Undertow Web 服务器使用虚拟线程(如果启用)。RestClient并且RestTemplate现在可以使用以下五个 HTTP 客户端中的任意一个(按优先顺序):Apache HTTP 组件 ( HttpComponentsClientHttpRequestFactory)、Jetty 客户端 ( JettyClientHttpRequestFactory)、Reactor Netty HttpClient( ReactorClientHttpRequestFactory)、JDK HttpClient( JdkClientHttpRequestFactory) 和 Simple JDK HttpURLConnection( SimpleClientHttpRequestFactory)。
在 ActiveMQ Classic 再次支持嵌入式代理后,Spring Boot 可以使用 再次自动配置它org.apache.activemq:activemq-broker。与 Spring Boot 2.7.x 相反,ActiveMQ 启动器仅为客户端。可观察性属性spring.application.group将属于更大单元的应用程序组合在一起。已为 OTLP 日志记录添加了 Docker Compose 和 Testcontainers 支持。
Spring Boot 不再依赖OkHttp库,因此需要它的用户现在必须自己管理版本。@MockBean和@SpyBean注释已被弃用,取而代之的是 Spring Framework 的@MockitoBean和MockitoSpyBean。 Spring Boot 3.4 仅适用于 Gradle 7.6.4 和 Gradle 8.4.0 版本系列或更高版本。
Spring Boot 3.4 中值得注意的 Spring 依赖项升级包括 Spring Security 6.4、Spring Session 3.4、Spring Integration 6.4、Spring Batch 5.2 和 Spring for Apache Kafka 3.3。值得注意的第三方依赖项升级包括 Log4j 2.24、Liquibase 4.29、Flyway 10.20、MySQL 9.1.0、MongoDB 5.2.0、Hibernate 6.6、Reactor 2024.0.0、Kafka 3.8、Jackson 2.18、Apache Http Client 5.4、Micrometer 1.14、HtmlUnit 4.3.0、Selenium 4.25.0、Mockito 5.13、JUnit Jupter 5.11 和 Testcontainers 1.20.3。
Spring Framework 6.0 和 6.1 以及 Spring Boot 3.0 和 3.2 具有更多面向用户的功能,例如使用 GraalVM Native Image 进行提前编译或支持虚拟线程和 CRaC。 Spring Framework 6.2 和 Spring Boot 3.4 缺乏此类引人注目的功能。 对于 Spring Framework 一代的最后一年来说,这并不罕见:在 2022 年 6.0 发布之前,2021 年根本没有发布 Spring Framework 。
Spring Framework 项目负责人Juergen Hoeller最近宣布,新的 Spring Framework 7 和 Spring Boot 4 将于 2025 年 11 月发布。它们将保留 JDK 17 基线,但“拥抱即将推出的 JDK 25 LTS”,预计该版本将提前两个月发布。Kotlin 基线将迁移到 Kotlin 2,Jakarta EE 基线从 9 迁移到 11,这将带来 Tomcat 11、Hibernate ORM 7 和 Hibernate Validator 9。Spring 项目还将采用JSpecify 来实现空值安全。
VMware 的 Spring Framework 核心提交者Juergen Hoeller 和Sébastien Deleuze热情地回答了 InfoQ 的问题。
InfoQ:Spring Framework 6 是自 2.0 以来最短的一代,2009 年 2.0 也经过三年就结束了。为什么?
Juergen Hoeller:从历史上看,我们的框架更新换代都是由当时的个别因素推动的。我们从未设定某一代的特定生命周期,而是设定触发新版本的某些功能范围。出于同样的原因,我们的次要版本发布节奏通常为每年一次,但偶尔会跳过一年。我们为每一代的最后一个功能版本提供长期支持;多年来一直如此。
展望未来,我们正在适应行业趋势,其中可预测的发布,特别是可预测的长期支持节奏将成为常态。最重要的是,我们正在适应更频繁的 JDK 节奏和更频繁的第三方依赖项主要版本。因此,我们现在不再受范围驱动,而是受时间驱动,主要是针对 Spring Boot,也针对 Spring Framework
InfoQ:Spring Framework 6 需要 JDK 17,而 JDK 17 当时已经有一年的历史了。Spring Framework 7 将以 Java 17 为基准,而不是使用当时已有两年历史的 JDK 21。为什么 Spring 7 自 2006 年 2.0 以来首次保留了前几代 Java 的基准?
Hoeller:我们的基准通常源自技术问题。Java 17 比 Java 11(当时的替代选择)提供了许多优点,因此我们立即在 Spring Framework 6.0 中采用了它,大大实现了代码库的现代化,并推动了整个行业的发展 - 但代价是升级路径变得更加困难,同时 Jakarta EE 命名空间也发生了变化。
对于 Spring Framework 7.0,Java 基线升级几乎没有任何技术优势。可以通过多版本 jar 轻松提供针对较新 Java 版本的特定功能,就像我们已经为 Java 21 中的虚拟线程所做的那样。当前的行业共识显然围绕 Java 17 基线,例如,Jakarta EE 11 API 和即将推出的提供程序一代。由于我们当前的框架代码库不会从基线升级中受益,因此我们的目标是保持 Java 17 基线,同时在同一代中为 Java 21 和 Java 25 提供一流的支持。相反,我们的基线提升附带 Jakarta EE 11 API,例如 Jakarta Servlet 6.1 和 Jakarta Persistence 3.2,以及 Kotlin 2。
我们通常建议将最新的 Java LTS 版本用于生产部署,与底层基线无关,这实际上只是框架在运行时容忍的技术最低限度。对于 Spring Framework 7.0,尽管 Java 17 是基线,但我们的重点显然是拥抱 Java 25。展望未来,我们可以看到 Java 25 在未来成为更广泛的 Java 生态系统的一个有吸引力的新基线。但是,目前,我们能做的最好的事情就是将其作为我们 JDK 版本范围的一部分来支持。
InfoQ:Spring 7 公告中提到了 JSpecify,它标准化了空安全注解。Spring Framework 6 和 Spring Boot 3 目前是如何暴露空安全的?Spring Framework 7 和 Spring Boot 4 中又会有哪些变化?
Sébastien Deleuze:@Nullable Spring Framework 6 提供了类似包中的空安全注释org.springframework.lang。这些注释使用 JSR 305 注释(一种休眠但广泛使用的 JSR)进行元注释,让 IDEA 或 Kotlin 等工具供应商能够以通用方式提供空安全支持。
在 Spring Framework 7 中,我们将暂时迁移到JSpecify注释,这是 Spring 团队参与多年的一项全行业努力,并且将弃用 Spring 空安全注释。
迁移到 JSpecify 应该会带来各种改进,例如:
为工具供应商提供适当的规格,并为最终用户提供文档。不再因 JSR 305 注释而导致拆分包,从而影响 JPMS 兼容性。更好的 Kotlin 集成。能够指定泛型类型、数组和可变参数元素空安全。可供其他不基于 Spring 的库使用,例如 Reactor 和 Micrometer。
我们还打算在进一步的 Spring 组合项目中全面指定 API 空安全。
InfoQ:Spring 7 的发布会上提到了“与 GraalVM 和 Project Leyden 的战略联盟”。是什么让这种联盟具有战略意义呢?
德勒兹:我们与 GraalVM 和莱顿项目的结盟具有战略意义,主要有三个原因。
首先,它们是互补的。GraalVM 提供了巨大的好处,例如即时启动/预热,但代价是构建时间长和兼容性问题等重大限制。Project Leyden 的 AOT 缓存提供了巨大的好处,例如启动时间快了 3 到 4 倍 - 可能不如 GraalVM 原生镜像那么引人注目,但对于许多用户来说已经足够了,而且在使用 Spring Boot 专用支持时副作用很少。专注于这两种技术将增强 Spring Boot 4 应用程序在许多部署场景中的效率。
其次,Spring 团队与这两个团队都有着积极的研发合作,最近在 Project Leyden 上与 Java 平台团队进行了联合会谈,在 2024 年比利时 Devoxx 大会上与GraalVM 团队就原生图像进行了联合会谈,就说明了这一点。
第三,这也是一种战略,因为我们将大部分研发精力集中在这些技术上,为寻求指导的 Spring 开发人员提供两条黄金路径。两者都可以利用 Spring Ahead-Of-Time 优化和 Buildpacks。我们预计 Project Leyden 的 AOT 缓存将成为类数据共享(CDS) 的后继者,我们目前从 Spring Boot 3.3 开始支持它。
目前,我们还没有计划在 CRaC 项目上投入更多精力,因为对于我们的用户来说,该项目往往更难利用 - 请参阅此比较。因此,借助 Leyden 项目在 JVM 上的 AOT 缓存(以及临时的 CDS)以及基于 GraalVM 的本机映像,我们正在努力为 Spring Boot 4 代提供两种主流效率选项。
有关更多信息,请参阅Spring Framework 6.2和Spring Boot 3.4的发行说明。
相关推荐
- 用Java实现RAG的3大核心模块与7个必知细节
-
一、真实场景驱动:某制造企业的知识管理之痛某汽车零部件企业有超过20万份技术文档(PDF/HTML/Word),工程师每天平均花费2小时查找资料。我们为其构建的Java版RAG系统,将查询耗时缩短至1...
- 在 C# .NET 中从 PDF 中提取表数据
-
概述:...
- 【分享】教你如何使用 Java 读取 Excel、docx、pdf 和 txt 文件
-
在Java开发中,我们经常需要读取不同类型的文件,包括Excel表格文件、"doc"和"docx"文档文件、PDF文件以及纯文本文件。其中最常用的是A...
- Spring AI 模块架构与功能解析
-
SpringAI是Spring生态系统中的一个新兴模块,专注于简化人工智能和机器学习技术在Spring应用程序中的集成。本文将详细介绍SpringAI的核心组件、功能模块及其之间的关...
- 告别付费!一站式服务,PDF多功能工具!
-
大家好,我是Java陈序员。今天,给大家介绍一个PDF多功能在线操作工具,完全免费开源!...
- 本地PDF操作神器:永久告别盗版和破解,再也不用担心安全问题
-
前言PDF(便携式文档格式)目前已经成为了文档交换和存储的标准。然而,找到一个功能全面、安全可靠、且完全本地化的PDF处理工具并不容易。...
- Python rembg 库去除图片背景
-
rembg是一个强大的Python库,用于自动去除图片背景。它基于深度学习模型(如U^2-Net),能够高效地将前景物体从背景中分离,生成透明背景的PNG图像。本教程将带你从安装到实际应用...
- 31个必备的python字符串方法,建议收藏
-
字符串是Python中基本的数据类型,几乎在每个Python程序中都会使用到它。...
- python学习day1——输出格式化
-
print一般在控制台中我们用print进行输出,默认情况下,使用格式为:print(*objects,sep='',end='\n')第一个参数是我们要在控制台...
- 一张图认识Python(附基本语法总结)
-
一张图认识Python(附基本语法总结)一张图带你了解Python,更快入门,一张图认识Python(附基本语法总结)Python基础语法总结:1.Python标识符在Python里,标识符有字...
- 学习编程第188天 python编程 字典格式化
-
今天学习的是刘金玉老师零基础Python教程第84期,主要内容是python字典格式化。...
- Python基础数据类型转换
-
Python中的基础数据类型转换可以分为隐式转换和显示转换。隐式转换是python解释器自动转换,显示转换是通过内置函数实现。无论哪种方式进行的转换,均为转换为对应类型的数据,而非改变原数据的类型。...
- python之json基本操作
-
1.概述JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,它具有简洁、清晰的层次结构,易于阅读和编写,还可以有效的提升网络传输效率。Python标准库的...
- Python之迭代器及其用法
-
前面章节中,已经对列表(list)、元组(tuple)、字典(dict)、集合(set)这些序列式容器做了详细的介绍。值得一提的是,这些序列式容器有一个共同的特性,它们都支持使用for循环遍历存储...
- 从初始化一个现代 python项目学习到的东西
-
uv我准备用uv初始化一个python项目环境我用的是苹果笔记本MacBookPro,具体的操作系统及硬件参数如下:...
- 一周热门
-
-
C# 13 和 .NET 9 全知道 :13 使用 ASP.NET Core 构建网站 (1)
-
因果推断Matching方式实现代码 因果推断模型
-
git pull命令使用实例 git pull--rebase
-
git 执行pull错误如何撤销 git pull fail
-
面试官:git pull是哪两个指令的组合?
-
git fetch 和git pull 的异同 git中fetch和pull的区别
-
git pull 和git fetch 命令分别有什么作用?二者有什么区别?
-
还可以这样玩?Git基本原理及各种骚操作,涨知识了
-
git pull 之后本地代码被覆盖 解决方案
-
git命令之pull git.pull
-
- 最近发表
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)