Spring Boot 2.5 版本说明
从Spring Boot 2.4升级
SQL脚本数据源初始化
用于支持schema.sql
和data.sql
脚本的基础方法在Spring Boot 2.5中被重新设计了。spring.datasource.*
与DataSource
初始化有关的属性已被弃用,而采用新的spring.sql.init.*
属性,它也可用于初始化通过R2DBC访问的SQL数据库。
新的基于脚本的SQL数据库初始化不支持对模式(DDL)和数据(DML)的变化使用单独的凭证。这降低了复杂性,并使其功能与Flyway和Liquibase一致。如果你需要为模式和数据初始化使用单独的凭证,请定义你自己的org.springframework.jdbc.datasource.init.DataSourceInitializer
bean。
Hibernate and data.sql
默认情况下,data.sql
脚本现在会在Hibernate初始化前运行。这使基于脚本的基本初始化的行为与Flyway和Liquibase的行为一致。如果你想使用data.sql
来填充Hibernate创建的模式,将spring.jpa.defer-datasource-initialization
设置为true
。虽然不建议混合使用数据库初始化技术,但这也允许你在通过data.sql
填充Hibernate创建的模式之前,使用schema.sql
脚本来构建它。
Flyway 和 Liquibase JDBC URLs
如果你目前定义了spring.flyway.url
或spring.liquidibase.url
,你可能需要提供额外的username
和password
属性。在Spring Boot的早期版本中,这些设置来自于spring.datasource
属性,但对于提供自己的DataSource Bean的人来说,这证明是有问题的。
Spring Data Solr
在2021.0.0版本中,Spring Data Solr的自动配置被从Spring Data中移除,在这个版本中被移除。
Secure Info Endpoint
/info
执行器端点默认不再通过网络公开。此外,如果Spring Security在classpath上,该端点默认需要认证访问。
请参考exposing和securing执行器端点的文档,改变这些新的默认值。
默认的表达式语言(EL)实现
Spring Boot的Web和验证启动器中包含的EL实现已经改变。Tomcat的实现(org.apache.tomcat.embed.tomcat-embed-el
)现在被用来代替Glassfish的参考实现(org.glassfish:jakrta.el
)。
默认错误视图中的信息
默认错误视图中的messsage
属性现在被移除,而不是在不显示时留空。如果你解析了错误响应的JSON,你可能需要处理丢失的项目。
如果你想让消息被包括在内,你仍然可以使用server.error.include-message
属性。
记录关机钩子
我们现在默认为基于jar的应用程序注册一个日志关闭钩子,以确保日志资源在JVM退出时被释放。如果你的应用程序是以war形式部署的,那么关闭钩子就不会被注册,因为servlet容器通常处理日志问题。
大多数应用程序都需要关机钩子。然而,如果你的应用程序有复杂的上下文层次结构,那么你可能需要禁用它。你可以使用logging.register-shutdown-hook
属性来做到这一点。
Gradle默认的jar和war任务
Spring Boot Gradle插件不再自动禁用标准的Gradlejar
和war
任务。相反,我们现在对这些任务应用一个`classifier’。
如果你喜欢禁用这些任务,参考文档包括更新的例子。
Cassandra Throttling 属性
Spring Boot不再为spring.data.cassandra.request.throttler
属性提供默认值。如果你依赖max-queue-size
、max-concurrent-requests
、max-requests-per second
或drain-interval
,你应该设置对你的应用程序有意义的值。
定制jOOQ的DefaultConfiguration
。
为了简化jOOQ的DefaultConfiguration
的定制,现在可以定义一个实现DefaultConfigurationCustomizer
的bean。这个自定义器回调应该被用来支持定义一个或多个`*Provider’Bean,对它的支持现在已经被弃用了。
Groovy 3
Groovy的默认版本已经升级到3.x。如果你在使用Groovy的同时也在使用Spock,你也应该升级到最新的与Groovy 3.0兼容的Spock 2.0版本。或者,使用groovy.version
来降级到Groovy 2.5。
最低要求的变化
用Gradle构建的项目现在需要Gradle 6.8或更高版本。
从Spring Boot 2.3和2.4删除的内容
为了反映Spring Boot的发布兼容性政策,Spring Boot 2.3中废弃的代码已在Spring Boot 2.5中删除。在Spring Boot 2.4中废弃的代码仍然存在,并计划在Spring Boot 2.6中删除。
新的和值得注意的
提示:检查配置变化日志,了解配置变化的完整概况。
环境变量的前缀
现在可以为系统环境变量指定一个前缀,这样你就可以在同一个环境中运行多个不同的Spring Boot应用程序。使用SpringApplication.setEnvironmentPrefix(..)
来设置绑定属性时要使用的前缀。
例如,下面将添加一个myapp
前缀。
SpringApplication application = new SpringApplication(MyApp.class);
application.setEnvironmentPrefix("myapp");
application.run(args);
现在所有的属性都将期望有一个前缀的版本。例如,要改变服务器端口,你可以设置MYAPP_SERVER_PORT
。
HTTP/2 over TCP (h2c)
所有四个嵌入式Web容器现在都支持HTTP/2 over TCP (h2c),无需任何手动定制。要启用h2c,将server.http2.enabled
设置为true
,并将server.ssl.enabled
设置为false
(其默认值)。
通用的数据源初始化
如果你编写初始化DataSource的代码,现在有了一个新的通用机制。这个机制现在也被内部用来为Flyway、Liquibase和基于脚本的初始化设置正确的Bean依赖关系。
大多数开发者不需要直接使用这个新机制。然而,如果你正在开发一个数据访问库的第三方启动器,你可能想提供一个DependsOnDataSourceInitializationDetector
。详见更新的参考文档。
用R2DBC初始化数据库
增加了对通过R2DBC访问的SQL数据库的基于脚本的初始化支持。默认情况下,classpath上名为schema.sql
和data.sql
的脚本将被自动应用到数据库中。初始化可以使用spring.sql.init.*
配置属性来定制。请参阅参考文档了解更多细节。
Liquibase数据源
如果你定义了一个用于Liquibase的自定义数据源,我们现在使用SimpleDriverDataSource
来配置它。我们以前使用一个池化数据源,这对于数据库初始化来说是不必要的,而且效率很低。
分层的WARs
Spring Boot的Maven和Gradle插件现在允许你创建分层WAR,以便与Docker镜像一起使用。分层WAR的工作方式与Spring Boot早期版本中提供的分层JAR支持类似。请查看Gradle和Maven参考文档,了解更多细节。
Docker镜像构建支持
定制构建包
Maven和Gradle插件现在都支持使用自定义Buildpacks。你可以设置buildpacks
属性来指向目录、tar.gz文件、特定的构建器参考或Docker镜像。
Bindings
Maven和Gradle插件现在都支持卷的绑定,可以传递给构建包生成器。这允许你绑定本地路径或卷,供构建包使用。
War 支持
Maven和Gradle插件现在都能将可执行的war文件打包成Docker镜像。如果你想为war文件创建Docker镜像,应使用现有的mvn spring-boot:image
或./gradlew bootBuildImage
命令。
Prometheus的OpenMetrics
/actuator/prometheus
执行器端点现在可以提供标准的Prometheus和OpenMetrics响应。返回的响应将取决于HTTP请求中提供的接受头。
Metrics for Spring Data Repositories
Actuator现在将为Spring Data资源库生成Micrometer度量。默认情况下,指标被命名为spring.data.repository.invocations
。要了解更多,请看参考文档的相关部分。
@Timed Metrics with WebFlux
与Spring MVC的功能一致,@Timed
现在可以用来手动启用WebFlux控制器和功能处理程序处理的请求的时间。要使用手动计时,请将management.metrics.web.server.request.autotime.enabled
设为false
。
MongoDB Metrics
当使用Actuator时,Mongo的连接池和客户端发送的命令的度量现在会自动生成。要了解更多关于MongoDB度量的信息,请参见参考文档的相关部分。
Actuator Endpoint for Quartz
Actuator中加入了/quartz
端点。它提供关于Quartz作业和触发器的详细信息。请参阅Actuator的API文档的相关部分了解更多细节。
向 "actuator/startup "的 "GET "请求
执行器的startup
端点现在支持GET
请求。与POST
请求不同,对端点的GET
请求不会耗尽事件缓冲区,事件将继续保留在内存中。
Abstract Routing DataSource Health
执行器的健康端点现在可以显示一个AbstractRoutingDataSource'的目标的健康状况。每个目标
数据源都是用它的路由键命名的。和以前一样,要在健康端点中忽略路由数据源,请将
management.health.db.ignore-routing-data-sources设置为
true’。
Java 16支持
该版本提供了对Java 16的支持并进行了测试。Spring Boot 2.5仍与Java 8兼容。
Gradle 7支持
Spring Boot Gradle插件支持Gradle 7.0.x,并经过了测试。
Jetty 10支持
Spring Boot 2.5现在可以使用Jetty 10作为嵌入式Web服务器。由于Jetty 10需要Java 11,我们默认的Jetty版本将保持为9。
要升级到Jetty 10,请直接声明依赖关系或在pom.xml中使用jetty.version
属性。
文档更新
该项目发布的HTML文档有一个更新的外观和感觉,并有一些新功能。你现在可以通过将鼠标悬停在样本上并点击 "复制 "图标,轻松地将代码片段复制到剪贴板。此外,许多样本现在包括完整的导入语句,可以根据需要显示或隐藏。
我们现在还在每个文件的顶部有一个 "黑暗主题 "切换器。
杂项
除了上述变化外,还有很多小的调整和改进,包括。
management.endpoints.web.cors.allowed-origin-patterns
现在可以用来配置Actuator端点的允许来源模式。 (#24608)HttpSessionIdListener
Bean现在可以自动注册到servlet上下文中。(#24879)- Couchbase现在默认使用自动配置的`ObjectMapper’。 (#24616)
- 当elasticsearch-rest-client-sniffer模块在classpath上时,Elasticsearch的 "Sniffer "现在可以自动配置了。(#24174)
spring.data.cassandra.controlconnection.timeout
现在可以用来配置Cassandra的控制连接的超时。 (#24189)spring.kafka.listener.only-log-record-metadata
现在可以用来配置尝试重试时的记录内容。(#24582)- 支持Apache Phoenix,自动检测
jdbc:phoenix
JDBC URLs (#24114) - Rabbit的密钥存储和信任存储算法的配置属性 (#24076)
- 现在可以使用
management.endpoints.web.discovery.enabled
属性禁用/actuator
发现页面。 /actuator/configprops
和actuator/env
端点现在有additional-keys-to-sanitize
属性,可以用来对键进行消毒。- 如果你想定制JMX执行器端点的名称,你现在可以使用
EndpointObjectNameFactory
。 - 增加了一个新的
DataSourceBuilder.derivedFrom(...)
方法,允许你建立一个新的DataSource
,它是由现有的DataSource
衍生出来的。 - 当Spring Security在classpath上时,配置属性现在可以被绑定到
RSAPublicKey
和RSAPrivateKey
。 - Spring AMQP 使用的 RabbitMQ
ConnectionFactory'现在可以使用
ConnectionFactoryCustomizer’bean 进行定制。 - 嵌入式数据库的自动配置现在可以使用新的
spring.datasource.embedded-data-connection
配置属性来控制。它可以被设置为EmbeddedDatabaseConnection
的任何值,包括none
以完全禁用嵌入式数据库的自动配置。 CloudPlatform
现在可以自动检测Azure应用服务。server.tomcat.keep-alive-timeout
可以用来配置Tomcat在关闭keep-alive连接前等待另一个请求的时间。server.tomcat.max-keep-alive-requests
可以用来控制一个keep-alive连接在被关闭之前的最大请求数。spring.webflux.session.cookie.ame-site
可用于配置WebFlux的SameSite cookie策略。默认情况下,它是宽松的。- Apache HttpClient 5现在可以自动配置为与WebClient一起使用。
- 一个新的
ApplicationEnvironment
类已经被引入,它应该能提高一个小的性能。 - 现在你可以使用
spring.netty.leak-detection
属性来配置Netty内存。
依赖升级
Spring Boot 2.5转移到几个Spring项目的新版本。
- Spring Data 2021.0
- Spring Integration 5.5
- Spring Security 5.5
- Spring Session 2021.0
- Spring HATEOAS 1.3
- Spring Kafka 2.7.0
众多的第三方依赖也被更新,其中一些更值得注意的是以下内容。
- Kotlin 1.5
- Groovy 3.0
- Flyway 7.7
- Liquibase 4.2
- Jackson 2.12
- Kafka 2.7
- Cassandra Driver 4.10
- Embedded Mongo 3.0
- Hibernate Validator 6.2
- Jersey 2.33
- Mockito 3.7
- MongoDB 4.2
- JUnit Jupiter 5.7
- Elasticsearch 7.12
Spring Boot 2.5中值得注意的弃用情况
在Spring Boot 2.5中进行了以下值得注意的弃用工作
org.springframework.boot.actuate.endpoint.http
中的ActuatorMediaType和
ApiVersion改为
org.springframework.boot.actuate.endpoint`中的等价物。- 对实现jOOQ的
*Provider
回调接口或Settings
的Bean的支持已被废弃。应该使用DefaultConfigurationCustomizer
来代替。 org.springframework.boot.autoconfigure.data.jpa
中的EntityManagerFactoryDependsOnPostProcessor
已被重新定位到org.springframework.boot.autoconfigure.orm.jpa
。
Bug 修复
- 自动配置的资源处理程序不会被应用到子环境中 #26623
- Actuator在默认的安全配置和Spring Webflux中不使用CORS配置。#26614
- 在默认安全配置和Spring MVC下,执行器不使用CORS配置。 #26612
- 在Spring Boot 2.4中,SpringApplication的额外配置文件和活动配置文件的排序发生了变化。#26610
- 一个活跃的请求会使Jetty的关机时间推迟30秒 #26608
- SmartInitializingSingleton Bean在懒惰初始化时无法工作 #26606
- 当指标记录失败时,MVC和WebFlux指标过滤器对响应产生不利影响 #26596
- ConfigDataResolvers不能发出信号说它们应该被跳过 #26585
- 如果actuator和spring security在classpath上,则无法访问远程devtools端点。 #26584
- 当通配符目录位置不匹配任何文件时,错误信息会引起误解 #26583
- 有模式的强制性地点失败,有例外 #26582
- 如果没有文件贡献,带有通配符的非选择位置会失败 #26581
- 在环境中以编程方式设置的配置文件不再与活动的配置文件属性合并。 #26580
- 当配置文件被配置为YAML列表时,无法检测到在特定配置文件中使用spring.profiles.include #26575
- ConfigurationProperties是通过classpath扫描获取的,但并不表明它应该被索引。 #26463
- 缓冲应用启动失败,出现NoSuchElementException #26458
- 当使用长文件名的自定义构建包镜像时,构建镜像失败 #26445
- 当使用传统的处理方法时,额外的配置文件处理得太晚了 #26434
- 如果直接导入一个特定档案的属性文件,会出现配置数据位置不存在的错误。 #26402
- StandardConfigDataLoader可以以不正确的顺序导入配置文件的特定文件 #26401
- productionRuntimeClasspath的可解析性和可消耗性与runtimeClasspath不一致。 #26365
- JacksonAutoConfiguration通过JacksonClusterEnvironmentBuilderCustomizer提供的ObjectMapper打破了Couchbase驱动。 #26363
- spring.config.import中的空值导致NullPointerException #26346
@DataRedisTest
不考虑RedisReactiveAutoConfiguration
。 #26328- 当一个
bean
导致了一个依赖性循环时,失败分析并没有清楚地说明这个循环 #26323 - SpringBootConfiguration通过classpath扫描被检索到,但并没有表明它应该被索引。 #26318
- Maven spring-boot:build-image忽略了ZIP布局 #26313
- 自定义任务后,配置bootBuildImage时,不能拾取targetCompatibility。 #26301
- 配置项元数据排序不一致 #26277
@EnableAutoConfiguration
和@ImportAutoConfiguration
使用不同的类加载器来寻找候选配置 #26237- spring.web.resources.cache.use-last-modified=false "在Spring MVC中不起作用。 #26233
- 恢复对来自RandomValuePropertySource的绑定配置属性的支持#26201
- 当spring.main.lazy-initialization=true时,
@Scheduled
方法未被触发。 #26156 - 当spring-core和spring-boot中的类由不同的ClassLoaders加载时,spring-boot无法找到自己的配置数据位置解析器 #26155
- ConfigFileApplicationListener#loadPostProcessors不能在子类加载器中加载EnvironmentPostProcessor #26126
文档
- 参考文档中的信息端点有过时的默认值 #26591
- 在Spock框架2.0发布后更新文档 #26586
- 更新Gradle文档以使用模块替换而不是依赖性替换 #26526
- 改进TestRestTemplate的容错性文档 #26522
- 记录下堆转储端点需要一个HotSpot JVM #26474
- 建议在使用Jersey作为过滤器时启用默认的servlet #26452
- 对Gradle 6.9的文档支持 #26409
- 修正DockerImageNames#couchbase中对Cassandra的错误引用 #26406
- PDF文档包括隐藏的代码元素 #26373
- 将 "使用代码 "从CONTRIBUTING.adoc移到wiki上。#26334
- 修正NamedContributors Javadoc中的拼写错误 #26325
- 波兰语README #26320
- 修复指向Webservices参考文档的链接 #26316
- 文件属性名称以实现反应性健康指标 #26299
- 文档中的DataSourceHealthIndicator有错误的键。 #26283
- 重新排列几个方法 #26262
- 将文档与主要的默认分支名称对齐 #26257
- 使系统要求中的Maven版本与实际测试的内容相一致 #26211
- 说明MeterFilters只适用于Spring管理的MeterRegistry。 #26186
- 使用Spring Java格式的Eclipse插件的新更新站点 #26172
- spring.profiles.include在配置元数据中具有过时的sourceType #26165
- 在 additional-spring-configuration-metadata.json 中包括 spring.profiles.group。 #26164
- 加强多个实体管理厂的在线文档 #26160
- SQL init模式定位和数据定位缺少元数据,导致它们被当作资源处理。 #26154
- 对spring.datasource.schema和spring.datasource.data的替换文件不正确 #26150
依赖升级
- Upgrade to ActiveMQ 5.16.2 #26528
- Upgrade to Caffeine 2.9.1 #26529
- Upgrade to Cassandra Driver 4.11.1 #26530
- Upgrade to Couchbase Client 3.1.5 #26531
- Upgrade to Dropwizard Metrics 4.1.21 #26532
- Upgrade to Ehcache 2.10.9.2 #26533
- Upgrade to Ehcache3 3.9.3 #26534
- Upgrade to Elasticsearch 7.12.1 #26535
- Upgrade to Glassfish JAXB 2.3.4 #26536
- Upgrade to Groovy 3.0.8 #26537
- Upgrade to Hazelcast 4.1.3 #26538
- Upgrade to Hibernate 5.4.31.Final #26539
- Upgrade to HttpClient5 5.0.4 #26540
- Upgrade to HttpCore5 5.1.1 #26541
- Upgrade to Infinispan 12.1.3.Final #26542
- Upgrade to Janino 3.1.4 #26543
- Upgrade to JBoss Transaction SPI 7.6.1.Final #26544
- Upgrade to Jedis 3.6.0 #26545
- Upgrade to Jetty 9.4.41.v20210516 #26603
- Upgrade to Jetty Reactive HTTPClient 1.1.8 #26546
- Upgrade to Johnzon 1.2.11 #26548
- Upgrade to jOOQ 3.14.9 #26549
- Upgrade to Json-smart 2.4.7 #26550
- Upgrade to JUnit Jupiter 5.7.2 #26551
- Upgrade to Kafka 2.7.1 #26552
- Upgrade to Kotlin 1.5.0 #26553
- Upgrade to Kotlin Coroutines 1.5.0 #26568
- Upgrade to Lettuce 6.1.2.RELEASE #26554
- Upgrade to Liquibase 4.3.5 #26555
- Upgrade to MariaDB 2.7.3 #26556
- Upgrade to Micrometer 1.7.0 #26379
- Upgrade to MySQL 8.0.25 #26557
- Upgrade to Neo4j Java Driver 4.2.5 #26558
- Upgrade to Netty 4.1.65.Final #26604
- Upgrade to Netty tcNative 2.0.39.Final #26560
- Upgrade to Pooled JMS 1.2.2 #26561
- Upgrade to Postgresql 42.2.20 #26562
- Upgrade to R2DBC Bom Arabba-SR10 #26563
- Upgrade to Reactor 2020.0.7 #26359
- Upgrade to SAAJ Impl 1.5.3 #26564
- Upgrade to Solr 8.8.2 #26565
- Upgrade to Spring AMQP 2.3.7 #26384
- Upgrade to Spring Batch 4.3.3 #26392
- Upgrade to Spring Data 2021.0.1 #26382
- Upgrade to Spring Framework 5.3.7 #26361
- Upgrade to Spring HATEOAS 1.3.1 #26380
- Upgrade to Spring Integration 5.5.0 #26388
- Upgrade to Spring Kafka 2.7.1 #26386
- Upgrade to Spring LDAP 2.3.4 #26394
- Upgrade to Spring Security 5.5.0 #26387
- Upgrade to Spring Session 2021.0.0 #26389
- Upgrade to Spring WS 3.1.1 #26390
- Upgrade to Thymeleaf Layout Dialect 2.5.3 #26566
- Upgrade to Tomcat 9.0.46 #26567