Spring Boot v2.3.RELEASE
参考链接:https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.3-Release-Notes#new-and-noteworthy
For full upgrade instructions and new and noteworthy features please see the release notes.
Spring Boot 2.3 Release Notes
Upgrading from Spring Boot 2.2
Changes to minimum requirements
Spring Boot 现在要求:
Gradle 6.3+ (如果你正在用Gradle构建). 5.6.x 也支持,但已弃用。
Jetty 9.4.22+ (如果您使用Jetty作为嵌入式容器)
Validation Starter no longer included in web starters
从#19550开始,Web和WebFlux启动器默认不再依赖于验证启动器。例如,如果您的应用程序正在使用验证特性,您会发现javax.validation.* imports没有被解析,你需要自己添加启动器。
对于Maven构建,可以使用以下方法实现这一点:
对于Gradle,你需要添加这样的东西:
Spring Data Neumann
Spring Boot 2.3附带了一个主要的Spring Data发布。如果您正在使用Cassandra、Couchbase、Elasticsearch、MongoDB或JDBC,则需要格外小心。
Cassandra
这个版本切换到Cassandra v4,它带来了许多向后不兼容的更改。如果您依赖于ClusterBuilderCustomizer来定制集群,这个概念在v4中已经不存在了,并且已经被两个更特定的定制器所取代:
DriverConfigLoaderBuilderCustomizer 自定义驱动程序的属性。请将此用于尚未公开的任何属性。
CqlSessionBuilderCustomizer 定制 CqlSession (以前的Session).
Cassandra v4驱动从接触点不再有自动本地直流推断。因此,必须使用默认的负载均衡策略设置“local-datacenter”属性,并且联络点必须是该数据中心的。一个新的 spring.data.cassandra.local-datacenter 属性已经被添加以方便设置本地数据中心。
Couchbase
这个版本切换到Couchbase SDK v3,它带来了许多向后不兼容的更改。
要连接到集群,您现在应该使用spring.couchbase.connection-string,而不是以前的spring.couchbase.bootstrap-hosts。
基于角色的访问控制现在已经普遍化了。
Spring Boot不再自动配置Bucket,但是您可以使用集群API轻松地做到这一点。
端点的IO配置已经在spring.couchbase.env.io中得到了协调。
如果您正在扩展CouchbaseConfiguration以自定义环境,请使用ClusterEnvironmentBuilderCustomizer以一种更习惯的方式来这样做。
如果使用 Spring Data Couchbase,则需要提供一个桶名。
Elasticsearch
已弃用的本地Elasticsearch传输已经被移除,因为Elasticsearch和Spring Data在它们的下一个版本中都不支持它。在这个版本中,对Jest库的支持也被删除了。
Spring Boot 默认要求使用Elasticsearch 7.5+。
MongoDB
该版本切换到MongoDB 4,并协调了响应式和命令式驱动程序。如果你用的是启动器,这对你来说应该是相当透明的。
有了这种协调,如果您使用spring-boot-starter-data-mongodb-reactive,就不再提供无响应的基础设施。如果你需要在启动时使用命令式基础架构(例如MongoOperations),可以考虑添加spring-boot-starter-data-mongodb。
Neo4j
默认情况下,Neo4j的open session in view interceptor现在是禁用的。如果需要再次启用它,请使用标准的spring.data.neo4j.open-in-view属性。
Neo4j运行状况指示器的详细信息现在包含版本和服务器的版本,示例如下:
JDBC
在它的新特性-new features中,Spring Data JDBC 2.0现在默认引用标识符。这个行为可以通过在RelationalMappingContext上调用setForceQuote(false)来禁用。
Micrometer
这个版本升级到Micrometer 1.5,带来了一些反对的地方:
服务水平协议-Service Level Agreements已被重命名为服务水平目标-Service Level Objectives ,边界表示为double而不是long。
波前-Wavefront 度量现在通过WavefrontSender导出。因此,读取和连接超时属性不再受到尊重。
Jackson
This release upgrades to Jackson 2.11 which includes a change to the default formatting of java.util.Date and java.util.Calendar. Please seeFasterXML/jackson-databind#2643for details.
这个版本升级到Jackson 2.11,其中包括对 java.util.Date和java.util.Calendar的默认格式的更改。详情请查看FasterXML/jackson-databind#2643。
Spring Cloud Connectors starter has been removed
The Spring Cloud Connectors starter wasdeprecated in 2.2 in favor of Java CFEnv. This starter has been removed, and Spring Cloud Connectors dependencies are no longer included in Spring Boot’s managed dependencies.
Spring Cloud Connectors starter在2.2中已弃用,取而代之的是Java CFEnv-deprecated in 2.2 in favor of Java CFEnv。这个启动器已经被删除,Spring Cloud连接器依赖项也不再包含在Spring Boot的托管依赖项中。
Embedded Servlet web server threading configuration
用于配置嵌入式Servlet web服务器(Jetty、Tomcat和Undertow)使用的线程的配置属性已经转移到专用线程组。现在可以在server.jetty.threads, server.tomcat.threads, 和server.undertow.threads找到属性。旧属性保留为弃用形式,以简化迁移。
Changes to the Default Error Page’s Content
默认情况下,错误消息和任何绑定错误不再包含在默认错误页面中。这减少了将信息泄露给客户机的风险。server.error.include-message 和server.error.include-binding-errors 可以分别用来控制消息和绑定各自的错误。支持的值是always, on-param和never。
Disk space health indicator
自动配置的磁盘空间运行状况指示器在应用程序启动时不再需要监视的路径存在。一个不存在的路径将被检测到具有零可用空间,从而导致指示灯的响应下降。
Automatic creation of developmentOnly Gradle configuration
仅开发配置,主要用于声明Spring Boot的DevTools依赖时使用,现在由Spring Boot的Gradle插件自动创建。任何手动的开发配置都可以从Gradle构建脚本中删除。
Removal of Maven Site Plugin management
Spring Boot的构建不再使用站点插件(maven-site-plugin),插件管理已经被删除。如果你依赖Spring Boot的托管版本,你应该添加你自己的插件管理。
Removal of Maven Exec Plugin custom configuration
如果您继承spring-boot-start -parent,它将不再配置Maven的exec插件(exec- Maven -plugin)来使用start-class设置主类。如果你依赖它,你可以按照以下方式恢复这种行为:
ApplicationContextRunner disables bean overriding by default
为了与SpringApplication保持一致,ApplicationContextRunner现在默认禁用bean覆盖。如果您需要对测试使用bean覆盖,那么可以使用withAllowBeanDefinitionOverriding 来启用它。
Activating multiple profiles with @ActiveProfiles
现在@ActiveProfiles注解支持包含逗号的配置属性名字。这意味着像@ActiveProfiles("p1,p2")这样的注释将把提供的值p1,p2作为一个单独的配置文件名称。要激活多个配置文件,请像@ActiveProfiles({"p1","p2"})中那样将每个配置文件名称作为一个单独的值提供
WebServerInitializedEvent and ContextRefreshedEvent
作为引入对优雅关闭-graceful shutdown的支持的一部分,web服务器初始化现在在应用程序上下文刷新处理结束时执行,而不是在刷新处理完成后立即执行。因此,WebServerInitializedEvent现在在ContextRefreshedEvent之前发布。
Deprecations from Spring Boot 2.2
在Spring Boot 2.2中弃用的大多数类、方法和属性已经在这个版本中删除了。请确保在升级之前没有调用已弃用的方法。
Configuration properties
许多属性已被重命名或弃用。您可以使用spring-boot-properties-migrator模块来标识这些属性。一旦将其作为依赖项添加到项目中,它不仅会分析应用程序的环境并在启动时打印诊断结果,还会在运行时为您临时迁移属性。
备注:完成迁移后,请确保从项目的依赖项中删除此模块。
New and Noteworthy
Tip 检查 the configuration changelog for 配置更改的完整概述。
Java 14 support
Spring Boot 2.3增加了对Java 14的支持。也支持Java 8和11。
Build OCI images with Cloud Native Buildpacks
Support forbuilding Docker imagesusingCloud Native Buildpacksand has been added to the Maven and Gradle plugins via thespring-boot:build-image goaland thebootBuildImage task. ThePaketoJava buildpack is used by default to create images.
使用Cloud Native Buildpacks的building Docker images和已经被Maven和Gradle插件添加通过spring-boot:build-image goal和bootBuildImage task 。默认情况下,Paketo Java buildpack 用于创建图像。
Build layered jars for inclusion in a Docker image
Maven和Gradle插件支持将内容分层构建jar文件。该层根据更改的频率将jar的内容分开。这种分离允许更有效地构建Docker映像。未更改的现有层可以与已更改的层一起重用。
根据您的应用程序,您可能想要优化如何创建层和添加新层。这可以通过配置来实现,该配置描述了如何将jar划分为几个层,以及这些层的顺序。
当您创建分层jar时,spring-boot-jarmode-layertools jar将默认作为依赖项添加到您的jar中(这可以通过构建配置禁用)。有了这个类路径上的jar,您就可以以一种特殊的模式启动应用程序,这种模式允许引导代码运行与您的应用程序完全不同的东西,例如,提取层的东西。要查看可用选项,使用-Djarmode=layertools启动一个fat jar,示例如下:
Predictable Classpath Ordering When Exploding Fat Jars
用Maven和Gradle构建的fat jar现在包含了一个索引文件。当jar被分解时,这个索引文件用于确保类路径的顺序与直接执行jar时相同。
Support of wildcard locations for configuration files
Spring Boot现在在加载配置文件时支持通配符位置。默认情况下,支持jar外部的config/*/通配符位置。当有多个配置属性源时,这在Kubernetes这样的环境中非常有用。例如,如果你有单独的mysql和redis配置,他们可以自动选择,如果你把他们放在/config,即/config/mysql/application.properties 和 /config/redis/application.properties。
Graceful shutdown
所有四个嵌入式web服务器(Jetty、Reactor Netty、Tomcat和Undertow)以及响应式和基于servlet的web应用程序都支持优雅关闭。当使用server启用时使用server.shutdown=graceful,关闭后,web服务器将不再允许新的请求,并等待活动请求完成的宽限期。宽限期可以使用spring.lifecycle.timeout-per-shutdown-phase来配置。详情请参阅参考文档-reference documentation。
Liveness and Readiness probes
Spring Boot现在拥有应用程序可用性的内置知识,可以跟踪应用程序是否处于活动状态,以及它是否准备好处理流量。运行状况端点可以启用 management.health.probes.enabled=true 配置属性公开应用程序的活跃度(/actuator/health/liveness)和就绪度(/actuator/health/readiness)。当运行在Kubernetes上时,这是自动完成的。
要了解更多关于这一特性的信息,请查看这篇博文-this blog post及其链接的参考文档。
Spring Data Neumann
Spring Boot 2.3附带了一个主要的Spring Data版本.。请查看Spring Data Neumann goes GA以学习更多。
R2DBC support
当r2dbc在类路径上时,ConnectionFactory以与jdbc数据源类似的方式自动配置。如果Spring Data在类路径上,存储库也会像往常一样自动配置。
R2DBC支持还添加了连接工厂的运行状况指示器、ConnectionPool的指标和测试片@DataR2dbcTest。
Configurable base path for WebFlux applications
现在可以配置WebFlux应用程序的所有web处理程序的基本路径。使用spring.webflux.base-path 属性。
Date-Time conversion in web applications
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 Improvements
End-to-end Traceability for Configuration Properties
As of#17886, the /actuator/configprops endpoint provides end-to-end information about configuration properties, aligning its behavior with the environment endpoint. For example, after adding server.server-header=Spring Boot in your application.properties, the endpoint will show you the following:
从#17886,开始,/actuator/configprops端点提供了关于配置属性的端到端信息,使其行为与环境端点保持一致。例如,在你的应用程序中添加server.server-header=Spring Boot到你的application.properties,端点将显示以下内容:
Names in metrics endpoint are ordered alphabetically
在/actuator/metrics/可以得到的指标名称现在按字母顺序排列,这使得它更容易找到你正在寻找的东西。
Query-less datasource health indicator
在没有验证查询的情况下,数据源HealthIndicator现在使用 java.sql.Connection#isValid 验证连接以query-less模式操作。
Contributing additional tags to Web MVC and WebFlux metrics
除了默认为MVC和WebFlux提供的标签之外,现在还可以贡献标签。对于MVC,可以使用WebMvcTagsContributor @Bean;对于WebFlux,可以使用WebFluxTagsContributor @Bean。
Auto-configuration of Wavefront’s Sender
Wavefront 自动配置已经被更新成定义一个WavefrontSender bean。这允许在单个连接上发布Wavefront度量和跟踪。
Native Kafka metrics
Kafka指标是为自动配置的ConsumerFactory和ProducerFactory创建的消费者和生产者发布的。要为自定义工厂创建的组件生成指标,您应该添加一个监听器,示例如下:
备注:如果你只是为了收集Kafka指标而启用JMX支持,那么就没有必要了。
RSocket support for Spring Integration
Spring Boot现在为Spring Integration的RSocket支持提供自动配置。
如果spring-integration-rsocket可用,开发人员可以使用spring.rsocket.server.*”相关属性配置RSocket服务器,并让它使用IntegrationRSocketEndpoint或RSocketOutboundGateway组件来处理传入的RSocket消息。
Binding to Period
如果一个属性需要表示一段时间,可以使用java.time.Period属性。与Duration支持类似,支持一种简单的格式(即10周10w)以及元数据支持。
Slice test for Web Services
一个新的 @WebServiceClientTest 注解已经被添加支持Web Services的“slice”测试 。
Dependency Upgrades
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 Boot 2.2相同的Spring Framework and Reactor生成构建。
许多第三方依赖关系也得到了更新,其中一些比较值得注意的是:
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
Miscellaneous
除了上面列出的变化,还有很多小的调整和改进,包括:
在我们的JPA支持中更新了缺省配置,以改进测试体验, 查看#16230和#16747.
spring-boot-autoconfigure-processor的输出现在是可重复的,这使得它在Gradle的构建缓存中工作得更好。
Couchbase的类型键可以通过spring.data.couchbase.type-key配置。
OAuth2参数绑定现在可以通过@WebMvcTest来实现。
Jetty的后备队列可以使用server.jetty.max-queue-capacity进行配置。
可以使用spring.liquibase.tag来配置Liquibase的标签支持。现在可以通过spring.liquibase.clear-checksums属性来清除当前变更日志中的所有校验和。
Gradle 元数据现在已经发布了。
DataSourceBuilder 可以被用来配置 SimpleDriverDataSource.
DataSource指标有了一个新的描述。
云平台的自动检测可以使用spring.main.cloud-platform来覆盖。
当请求具有主体时,现在支持从执行器的HTTP端点缓存响应。
Maven support for creating a fat jar now honors the project.build.outputTimestamp property, allowing its output to bereproducible.
Maven对创建fat jar的支持现在以 project.build.outputTimestamp属性为荣,使其输出可重复生产-reproducible。
Maven插件的Javadoc 现在发布了-now published.
一个定制器接口, RSocketMessageHandlerCustomizer被提供给自定义自动配置RSocketMessageHandler,
一个定制器接口,DefaultCookieSerializerCustomizer,被提供给自定义自动配置 DefaultCookieSerializer.
Auto-configuration of the default servlet can now be disabled by setting server.servlet.register-default-servlet to false.
默认servlet的自动配置现在可以通过设置server.servlet.register-default-servlet=false来禁用。
添加了一个新的条件@ConditionalOnWarDeployment。它可以用于检测何时将应用程序作为war部署到Servlet容器或应用程序服务器。
properties migrator将处理所有弃用的属性,而不仅仅是那些带有错误级别的属性。
JDBC驱动程序在销毁war的ServletContext时被注销。
Redis’s sentinel密码可以被配置使用spring.redis.sentinel.password.
Deprecations in Spring Boot 2.3
spring.http. 相关属性已经被移动到server.servlet.encoding., spring.mvc. 和spring.codec., 查看#18827.
SpringApplication#refresh(ApplicationContext)已被弃用,替代的是SpringApplication#refresh(ConfigurableApplicationContext).
server.error.include-stacktrace使用的ON_TRACE_PARAM 属性已经被重命名为ON_PARAM。
org.springframework.boot.autoconfigure.elasticsearch.rest.RestClientBuilderCustomize已经被废弃,替代它的是org.springframework.boot.autoconfigure.elasticsearch.RestClientBuilderCustomizer