Spring Boot 2.3 版本发布说明
公司的 Spring Boot 还是 2.2.6 版本,计划升级到 2.6.x 版本,采用逐级升级测试影响范围,而不是跨版本升级。所以需要了解各个 次版本 的更新。此篇记录 Spring Boot 2.3 版本发布说明。
关注的几个更新。
- Web Starters不再包含Validation Starter,升级后需要单独引入。
- 升级了Jackson 版本,修改了 java.util.Date 和 java.util.Calendar 默认格式。
- 嵌入Servlet Web服务线程配置属性名更新。
- 增加对 Java 14 的支持,同样支持 Java 8 和 Java 11。
- 加载配置文件,增加支持位置通配符。
Spring Boot 版本号
Spring Boot 的版本号由 4 部分组成,分别是:主版本号.次版本号.修正版本号.版本阶段。
根据发布的版本号历史记录来看,从2.4.0 开始,正式版的版本号只由前 3 部分组成。
版本号意义 | 描述 | 备注 |
---|---|---|
主版本号 | 项目架构可能有重大调整,可能存在大版本不兼容 | |
次版本号 | 新的功能特性和变更 | |
修正版本号 | 修复Bug | |
版本阶段 | 当前版本所处的阶段 RELEASE:发布的标准版,正式版,或以符号®表示 SNAPSHOT:快照版,比较稳定,但仍在进行小量的改进和调整 M1~Mx:非公开发行的版本,PRE预览版(里程碑版), 一个正式版会经历多个里程碑。 |
发布状态标识,不跟在版本号里的,在Spring Boot 官方文档的版本列表会有此标识显示。
发布状态标识 | 描述 | |
---|---|---|
GA | General Availability,稳定版,正式版,标准版 | |
PRE | Preview 预览版,可能有些已知的Bug或还有待完善的功能 |
获取 Spring 和 Spring Boot 版本号:
1 | String version = SpringVersion.getVersion(); |
从Spring Boot 2.2升级
最低要求的变化
Spring Boot 现在要求:
Gradle 6.3+(如果使用 Gradle 构建),5.6.x 也受支持,但已弃用。
Jetty 9.4.22+(如果使用 Jetty 作为嵌入式容器)。
Web Starters不再包含Validation Starter
默认情况下,Web 和 WebFlux Starter不再依赖 Validation Starter。 如果的应用程序正在使用 Validation 功能,例如您发现 javax.validation.*
导入没有被解析,需要自己添加依赖器。
对于 Maven 构建,可以执行以下操作:
1 | <dependency> |
对于 Maven 构建,需要添加如下配置:
1 | dependencies { |
默认唯一的数据源名称
默认情况下,在启动时为自动配置的 DataSource 生成一个唯一名称。 这会影响 H2 控制台的使用,因为数据库 URL 不再引用 testdb
。
可以通过将 spring.datasource.generate-unique-name
设置为 false
来禁用此行为。
Spring Data Neumann
Spring Boot 2.3 附带了 Spring Data 的主要版本。 如果您使用 Cassandra、Couchbase、Elasticsearch、MongoDB 或 JDBC,则需要格外小心。
Cassandra
此版本切换到 Cassandra v4,它带来了许多向后不兼容的更改。 如果您依赖 ClusterBuilderCustomizer
来定制集群,这个概念在 v4 中不再存在,并且已经被两个更具体的定制器所取代:
DriverConfigLoaderBuilderCustomizer
自定义驱动属性. 请将此用于尚未公开的任何属性.CqlSessionBuilderCustomizer
自定义CqlSession
(formerSession
).
Cassandra v4 驱动程序不再具有来自接触点的自动本地 DC 推断。 因此,“local-datacenter”属性必须设置为默认负载平衡策略,并且联系点必须属于该数据中心。 添加了新的 spring.data.cassandra.local-datacenter 属性以轻松设置本地数据中心。
Couchbase
此版本切换到 Couchbase SDK v3,它带来了许多向后不兼容的更改。
要连接到集群,现在应该使用
spring.couchbase.connection-string
而不是以前的spring.couchbase.bootstrap-hosts
。基于角色的访问控制现已普及。
Spring Boot 不再自动配置
Bucket
,但可以使用 Cluster API 轻松做到这一点。端点 IO 配置已在
spring.couchbase.env.io
中统一。如果正在扩展
CouchbaseConfiguration
以自定义环境,请使用ClusterEnvironmentBuilderCustomizer
以更惯用的方式进行此操作。
如果将 Couchbase
与 Spring
Data 一起使用,则需要提供存储桶(bucket
)名称。
Elasticsearch
已弃用的Native Elasticsearch transport
已被删除,因为 Elasticsearch 和 Spring Data 本身在其下一个版本中都不会支持它。 此版本中还删除了对 Jest 库的支持。
Spring Boot 现在默认使用 Elasticsearch 7.5+。
MongoDB
此版本切换到MongoDB 4,并统一了响应式和命令式驱动程序。如果使用的是starter
,这应该是非常透明的。
一个值得注意的变化是,现在在使用命令式驱动程序时应用了MongoClientSettingsBuilderCustomizer
bean。以前,它们仅适用于响应式情况。
通过这种统一,如果使用spring-boot-starter-data-mongodb-reactive
,则不再提供非响应式基础架构。
如果需要在启动时使用命令式基础设施(例如MongoOperations),请考虑添加 spring-boot-starter-data-mongodb
。
Neo4j
Neo4j 的视图拦截器中的打开会话现在默认禁用。 如果需要再次启用它,请使用标准 spring.data.neo4j.open-in-view
属性。
Neo4j 健康指标的详细信息现在包含服务器的版本和版本,如下所示
1 | neo4j: { |
JDBC
在其新特性中,Spring Data JDBC 2.0 现在默认引用标识符。 可以通过在 RelationalMappingContext 上调用 setForceQuote(false)
来禁用此行为。
Micrometer
Micrometer:监控指标的度量类库,最流行的监控工具的应用程序指标外观,支持 Spring Boot 2 指标集合的检测库,适用于 Java 8 或更高版本。
此版本升级到 Micrometer 1.5,带来了一些弃用:
- 服务等级协议已重命名为服务等级目标,边界表示为
double
而非long
。 - Wavefront 指标现在通过
WavefrontSender
导出。 因此,不再支持读取和连接超时属性。
Jackson
此版本升级到 Jackson 2.11,其中包括对 java.util.Date 和 java.util.Calendar 的默认格式的更改。
有关详细信息,请参阅 FasterXML/jackson-databind#2643。
移除了Spring Cloud Connectors starter
Spring Cloud Connectors starter 在 2.2 中被弃用,取而代之的是 Java CFEnv
。
此 starter 已被删除,Spring Cloud Connectors 依赖项不再包含在 Spring Boot 的托管依赖项中。
嵌入Servlet Web服务线程配置
用于配置嵌入式 Servlet Web 服务器(Jetty、Tomcat 和 Undertow)使用的线程的配置属性已移至专用threads
组。
现在可以在 server.jetty.threads
、server.tomcat.threads
和 server.undertow.threads
中找到这些属性。 旧属性仍处于不推荐使用的形式,以简化迁移。
修改默认的Error Page’s内容
默认情况下,错误消息和任何绑定错误不再包含在默认错误页面中。这降低了向客户端泄露信息的风险。 server.error.include-message
和 server.error.include-binding-errors
可用于分别控制消息的和绑定错误。 支持的值有 alway
,on-param
和 never
。
磁盘空间健康指标
在应用程序启动时,自动配置的磁盘空间健康指示器不再需要被监视的路径存在。不存在的路径将被检测为具有零可用空间,从而导致指标的向下响应。
自动创建 developmentOnly
Gradle 配置
developmentOnly
配置主要用于声明对 Spring Boot's DevTools
的依赖时使用,现在由 Spring Boot 的 Gradle 插件自动创建。
应从 Gradle 构建脚本中删除 developmentOnly 的任何手动配置,因为它的存在将导致构建失败,并显示消息 cannot add a configuration with name 'developmentOnly' as a configuration has already exists
.
移除 Maven Site插件管理
如果继承自 spring-boot-starter-parent
,则不再配置 Maven 的 exec
插件(exec-maven-plugin
)使用(start-class)设置主类。
如果依赖它,则可以按如下方式恢复该行为:
1 | <plugin> |
ApplicationContextRunner 默认禁用 bean 覆盖
为了与 SpringApplication 保持一致,ApplicationContextRunner 现在默认禁用 bean 覆盖。
如果您需要使用 bean 覆盖进行测试,可以使用 withAllowBeanDefinitionOverriding
来启用它。
使用@ActiveProfiles激活多个配置文件
@ActiveProfiles
注解现在支持包含逗号的配置文件名称。 这意味着像 @ActiveProfiles("p1,p2")
这样的注解会将提供的值 p1,p2
视为单个配置文件名称。 要激活多个配置文件,请将每个配置文件名称作为单独的值(数组)提供,如 @ActiveProfiles({"p1","p2"})
。
WebServerInitializedEvent和ContextRefreshedEvent
作为引入对优雅关机支持的一部分,Web 服务器初始化现在是在应用程序上下文刷新处理结束时执行,而不是在刷新处理完成后立即执行。
因此,WebServerInitializedEvent
事件在现是在 ContextRefreshedEvent
之前发布。
Spring Boot 2.2的弃用
Spring Boot 2.2 中不推荐使用的大多数类、方法和属性已在此版本中删除。
请确保在升级之前没有调用过时的方法。
配置属性
许多属性已被重命名或弃用。 可以使用 spring-boot-properties-migrator
模块来识别这些属性。
一旦作为依赖项添加到的项目中,这不仅会分析您的应用程序的环境并在启动时打印诊断信息,还会在运行时为您临时迁移属性。
Maven:
1 | <dependency> |
Gradle:
1 | runtime("org.springframework.boot:spring-boot-properties-migrator") |
注意:完成迁移后,请确保从项目的依赖项中删除此模块。
新特性和值得注意的
提示:查看配置更改日志,了解配置更改的完整概述。
Java 14 support
Spring Boot 2.3 增加对 Java 14 的支持,也支持 Java 8 和 Java 11。
使用Cloud Native Buildpacks构建OCI镜像
支持使用 Cloud Native Buildpacks 构建 Docker 镜像,并已通过 spring-boot:build-image
目标和 bootBuildImage
任务添加到 Maven 和 Gradle 插件中。 Paketo Java buildpack 默认用于创建镜像。
构建分层 jar 以包含在 Docker 映像中
Maven 和 Gradle 插件中添加了对构建内容分层的 jar 文件的支持。分层根据 jar 内容的更改频率来分隔它们。这种分离允许构建更高效的 Docker 镜像。未更改的现有层可以重复使用,更改后的层可以放置在顶部。
根据应用程序的不同,您可能需要调整层的创建方式并添加新的层。这可以使用配置来完成,配置描述了如何将 jar 分成层以及这些层的顺序。
创建分层 jar 时,默认情况下 spring-boot-jarmode-layertools
jar 将作为依赖项添加到您的 jar 中(可以通过构建配置禁用)。使用类路径上的这个 jar,您可以在一种特殊模式下启动应用程序,该模式允许引导代码运行与您的应用程序完全不同的东西,例如,提取层的东西。
要查看可用选项,请使用 -Djarmode=layertools
启动一个大 jar,如以下示例所示:
1 | java -Djarmode=layertools -jar my-app.jar |
释放Jar包时可预的类路径排序
使用 Maven 和 Gradle 构建的大 jars 现在包含一个索引文件。 当 jar 被解压释放时,这个索引文件用来保证classpath的顺序,与直接执行jar时的顺序相同。
支持配置文件位置通配符
Spring Boot 现在在加载配置文件时支持位置通配符。 默认情况下,支持 jar 外部的 config/*/
位置通配符。
当有多个配置属性来源时,这在 Kubernetes 等环境中很有用。 例如,如果有单独的 mysql 和 redis 配置,如果将它们放在 /config
中,它们可以自动选择,即 /config/mysql/application.properties
和 /config/redis/application.properties
。
优雅关机
所有四个嵌入式 Web 服务器(Jetty、Reactor Netty、Tomcat 和 Undertow)以及响应式和基于 Servlet 的 Web 应用程序都支持优雅关闭。
当使用 server.shutdown=graceful
启用时,在关闭时,Web 服务器将不再允许新请求,并将等待活动请求完成的宽限期。
可以使用 spring.lifecycle.timeout-per-shutdown-phase
配置宽限期。 有关详细信息,请参阅参考文档。
活性 和 就绪探针
Spring Boot 现在内置了关于应用程序可用性的知识,可以跟踪它是否处于活动状态以及是否准备好处理流量。
可以将健康端点配置为使用 management.health.probes.enabled=true
配置属性公开应用程序的活跃性(/actuator/health/liveness
)和就绪性(/actuator/health/readiness
)。
在 Kubernetes 上运行时,这是自动完成的。
要了解有关此功能的更多信息,请查看此博客文章及其链接的参考文档。
Spring Data Neumann
Spring Boot 2.3 附带了一个主要的 Spring Data 版本。 请参阅 Spring Data Neumann go GA 以了解更多信息。
R2DBC 支持
当 r2dbc 存在于类路径上时,ConnectionFactory
会自动配置,配置方式与jdbc DataSource
类似。如果Spring Data 位于类路径上,存储库也会像往常一样自动配置。
R2DBC支持还为连接工厂添加了健康指示器、ConnectionPool
的指标和测试片@DataR2dbcTest
。
WebFlux 应用程序的可配置基本路径
现在可以配置 WebFlux 应用程序的所有 Web 处理程序的基本路径。 使用 spring.webflux.base-path
属性来执行此操作。
Web 应用程序中的日期时间转换
Web 应用程序中时间和日期时间值的转换现在可以通过应用程序属性进行配置。 这补充了对现有的格式化日期值的支持。
对于 MVC,属性分别为 spring.mvc.format.time
和 spring.mvc.format.date-time
。 对于 WebFlux,属性分别为 spring.webflux.format.time
和 spring.webflux.format.date-time
。
除了采用典型的格式化模式之外,用于配置日期、时间和日期时间格式的属性现在支持 iso
值。 设置后,将应用相应的 ISO-8601 格式。
以下属性支持 iso 值:
spring.mvc.format.date
spring.mvc.format.date-time
spring.mvc.format.time
spring.webflux.format.date
spring.webflux.format.date-time
spring.webflux.format.time
Actuator 改进
配置属性的端到端可追溯性
/actuator/configprops
端点提供有关配置属性的端到端信息,使其行为与环境端点保持一致。
例如,在 application.properties
中添加 server.server-header=Spring Boot
后,端点将显示以下内容:
1 | "serverHeader": { |
度量端点中的名称按字母顺序排列
/actuator/metrics/
中可用的指标名称现在按字母顺序排列,这样更容易找到您要查找的内容。
查询较少的数据源健康指示器
在没有验证查询的情况下,数据源 HealthIndicator 现在以无查询模式运行,使用 java.sql.Connection#isValid
来验证连接。
为 Web MVC 和 WebFlux 指标贡献额外的标签
除了默认为 MVC 和 WebFlux 提供的标签之外,现在可以贡献使用的标签。
可以使用用于 MVC 的 WebMvcTagsContributor
@Bean 和用于 WebFlux 的 WebFluxTagsContributor
@Bean 进行贡献。
Wavefront 发送器的自动配置
Wavefront 的自动配置已更新为定义 WavefrontSender
bean。 这允许通过单个连接将指标和跟踪发布到 Wavefront。
Native Kafka 度量指标
Kafka 度量指标是由自动配置的 ConsumerFactory
和 ProducerFactory
创建的消费者和生产者本地发布的。
要为自定义工厂创建的组件生成指标,应该添加一个侦听器,如以下示例所示:
1 | factory.addListener(new MicrometerConsumerListener<>(meterRegistry)); |
备注:如果启用 JMX 支持的唯一目的是收集 Kafka 指标,则不再需要这样做。
Spring Integration支持RSocket
Spring Boot 为 Spring Integration 的 RSocket 支持提供了自动配置。
如果 spring-integration-rsocket
可用,开发人员可使用 spring.rsocket.server.*
属性配置 RSocket 服务,并让它使用 IntegrationRSocketEndpoint
或 RSocketOutboundGateway
组件处理传入的 RSocket 消息。
绑定 Period
如果属性需要表示一段时间,可以使用 java.time.Period
属性来实现。
与持续Duration
支持类似,支持简单的格式(即 10w 表示 10 周)以及元数据支持。
Web 服务的切片测试
添加了一个新的 @WebServiceClient
Test 注解以支持 Web 服务的“切片”测试。
依赖版本升级
Spring Boot 2.3 升级了几个 Spring 项目的版本:
- Spring Data Neumann
- Spring HATEOAS 1.1
- Spring Integration 5.3
- Spring Kafka 2.5
- Spring Security 5.3
- Spring Session Dragonfruit
请注意,Spring Boot 2.3 构建的 Spring Framework 和 Reactor 生成与 Spring Boot 2.2 相同。
许多第三方依赖项也已更新,其中一些更值得注意的是:
- Artemis 2.12
- AssertJ 3.16
- Cassandra Driver 4.6
- Couchbase Client 3.0
- Elasticsearch 7.6
- Flyway 6.4
- Hibernate Validator 6.1
- Infinispan 10.1
- Jackson 2.11
- JUnit Jupiter 5.6
- Kafka 2.5
- Kotlin 1.3.72
- Lettuce 5.3
- Micrometer 1.5
- Mockito 3.3
- MongoDB 4.0
- QueryDSL 4.3
各种小调整和改进
除了上面列出的更改之外,还有许多小的调整和改进,包括:
- 我们的 JPA 支持中更新了配置默认值,以改善测试体验。
spring-boot-autoconfigure-processor
的输出现在是可重复的,使其与 Gradle 的构建缓存一起工作得更好。- Couchbase 的类型键可以通过
spring.data.couchbase.type-key
配置。了解Couchbae。 - OAuth2 参数绑定现在可用于
@WebMvcTest
。 - Jetty 的后备队列可以使用
server.jetty.max-queue-capacity
进行配置。 - Liquibase 的标签支持可以使用
spring.liquibase.tag
进行配置。现在可以通过spring.liquibase.clear-checksums
属性清除当前变更日志中的所有校验和。 - Gradle 元数据现已发布。
DataSourceBuilder
可用于配置SimpleDriverDataSource
。DataSource
度量指标现在有一个描述。- 可以使用
spring.main.cloud-platform
覆盖云平台的自动检测。 - 当请求具有主体时,现在支持缓存来自 Actuator 的 HTTP 端点的响应。
- Maven 对创建大 jar 的支持现在支持
project.build.outputTimestamp
属性,允许其输出可重现。 - Maven 插件的 Javadoc 现已发布。
- 提供了一个定制器接口,
RSocketMessageHandlerCustomizer
,用于定制自动配置的 RSocketMessageHandler。 - 提供了一个定制器接口
DefaultCookieSerializerCustomizer
,用于定制自动配置的DefaultCookieSerializer
。 - 现在可以通过将
server.servlet.register-default-servlet
设置为false
来禁用默认 servlet 的自动配置。 - 添加了一个新条件
@ConditionalOnWarDeployment
。它可用于检测应用程序是作为 Servlet 容器的 War 部署,还是作为应用程序服务器部署。 - 属性迁移器会处理所有不推荐(弃用)的属性,而不仅仅是那些具有错误级别的属性。
- 当 ServletContext 销毁时,JDBC 驱动程序被取消注册。
- Redis 的哨兵密码可以使用
spring.redis.sentinel.password
进行配置。
Spring Boot 2.3弃用
spring.http.
属性移动到server.servlet.encoding.
,spring.mvc.
,spring.codec.
。SpringApplication#refresh(ApplicationContext)
已被弃用,取而代之的是SpringApplication#refresh(ConfigurableApplicationContext)
。- 与
server.error.include-stacktrace
属性一起使用的ON_TRACE_PARAM
已重命名为ON_PARAM
。 org.springframework.boot.autoconfigure.elasticsearch.rest.RestClientBuilderCustomizer
已弃用,取而代之的是org.springframework.boot.autoconfigure.elasticsearch.RestClientBuilderCustomizer
参考文档
Spring Boot 2.3 版本发布说明
http://blog.gxitsky.com/2022/08/04/Spring-Boot-V2-3-Release-Notes/