Spring Framework 6.2 和 Spring Boot 3.4 为 2025 年新一代做好准备
wptr33 2024-12-13 16:38 20 浏览
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的发行说明。
相关推荐
- MySQL进阶五之自动读写分离mysql-proxy
-
自动读写分离目前,大量现网用户的业务场景中存在读多写少、业务负载无法预测等情况,在有大量读请求的应用场景下,单个实例可能无法承受读取压力,甚至会对业务产生影响。为了实现读取能力的弹性扩展,分担数据库压...
- 3分钟短文 | Laravel SQL筛选两个日期之间的记录,怎么写?
-
引言今天说一个细分的需求,在模型中,或者使用laravel提供的EloquentORM功能,构造查询语句时,返回位于两个指定的日期之间的条目。应该怎么写?本文通过几个例子,为大家梳理一下。学习时...
- 一文由浅入深带你完全掌握MySQL的锁机制原理与应用
-
本文将跟大家聊聊InnoDB的锁。本文比较长,包括一条SQL是如何加锁的,一些加锁规则、如何分析和解决死锁问题等内容,建议耐心读完,肯定对大家有帮助的。为什么需要加锁呢?...
- 验证Mysql中联合索引的最左匹配原则
-
后端面试中一定是必问mysql的,在以往的面试中好几个面试官都反馈我Mysql基础不行,今天来着重复习一下自己的弱点知识。在Mysql调优中索引优化又是非常重要的方法,不管公司的大小只要后端项目中用到...
- MySQL索引解析(联合索引/最左前缀/覆盖索引/索引下推)
-
目录1.索引基础...
- 你会看 MySQL 的执行计划(EXPLAIN)吗?
-
SQL执行太慢怎么办?我们通常会使用EXPLAIN命令来查看SQL的执行计划,然后根据执行计划找出问题所在并进行优化。用法简介...
- MySQL 从入门到精通(四)之索引结构
-
索引概述索引(index),是帮助MySQL高效获取数据的数据结构(有序),在数据之外,数据库系统还维护者满足特定查询算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构...
- mysql总结——面试中最常问到的知识点
-
mysql作为开源数据库中的榜一大哥,一直是面试官们考察的重中之重。今天,我们来总结一下mysql的知识点,供大家复习参照,看完这些知识点,再加上一些边角细节,基本上能够应付大多mysql相关面试了(...
- mysql总结——面试中最常问到的知识点(2)
-
首先我们回顾一下上篇内容,主要复习了索引,事务,锁,以及SQL优化的工具。本篇文章接着写后面的内容。性能优化索引优化,SQL中索引的相关优化主要有以下几个方面:最好是全匹配。如果是联合索引的话,遵循最...
- MySQL基础全知全解!超详细无废话!轻松上手~
-
本期内容提醒:全篇2300+字,篇幅较长,可搭配饭菜一同“食”用,全篇无废话(除了这句),干货满满,可收藏供后期反复观看。注:MySQL中语法不区分大小写,本篇中...
- 深入剖析 MySQL 中的锁机制原理_mysql 锁详解
-
在互联网软件开发领域,MySQL作为一款广泛应用的关系型数据库管理系统,其锁机制在保障数据一致性和实现并发控制方面扮演着举足轻重的角色。对于互联网软件开发人员而言,深入理解MySQL的锁机制原理...
- Java 与 MySQL 性能优化:MySQL分区表设计与性能优化全解析
-
引言在数据库管理领域,随着数据量的不断增长,如何高效地管理和操作数据成为了一个关键问题。MySQL分区表作为一种有效的数据管理技术,能够将大型表划分为多个更小、更易管理的分区,从而提升数据库的性能和可...
- MySQL基础篇:DQL数据查询操作_mysql 查
-
一、基础查询DQL基础查询语法SELECT字段列表FROM表名列表WHERE条件列表GROUPBY分组字段列表HAVING分组后条件列表ORDERBY排序字段列表LIMIT...
- MySql:索引的基本使用_mysql索引的使用和原理
-
一、索引基础概念1.什么是索引?索引是数据库表的特殊数据结构(通常是B+树),用于...
- 一周热门
-
-
C# 13 和 .NET 9 全知道 :13 使用 ASP.NET Core 构建网站 (1)
-
程序员的开源月刊《HelloGitHub》第 71 期
-
详细介绍一下Redis的Watch机制,可以利用Watch机制来做什么?
-
假如有100W个用户抢一张票,除了负载均衡办法,怎么支持高并发?
-
Java面试必考问题:什么是乐观锁与悲观锁
-
如何将AI助手接入微信(打开ai手机助手)
-
redission YYDS spring boot redission 使用
-
SparkSQL——DataFrame的创建与使用
-
一文带你了解Redis与Memcached? redis与memcached的区别
-
如何利用Redis进行事务处理呢? 如何利用redis进行事务处理呢英文
-
- 最近发表
- 标签列表
-
- 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)