SpringBoot 3.0 变更
一、新特性
JDK 17
Spring Boot 3.0 使用 Java 17作为最低版本,如果版本低于17,那么首先要升级你的JDK到JDK17。
如果你要使用Native Image特性,要使用GraalVM 22.3以上和 Native Build Tools Plugin 0.9.17 或更高的版本。
Jakarta EE 9
另外一个很重要的变化就是本次升级之后,最低只支持 Jakarta EE 9,使用 Servlet5.0 和 JPA3.0 规范,不过最新版本RC2已经升级到了 JakartaEE 10,默认使用 Servlet6.0 和 JPA3.1 规范。
有些同学可能连 Jakarta 是什么都不知道,这个英文单词是印尼首都雅加达的意思,其实就是我们知道的 JavaEE 改名之后就叫 JakartaEE,比如我们之前的 javax.servlet
包现在就叫 jakarta.servlet
。
也因此,代码中所有使用到比如 HttpServletRequest 对象的 import 都需要修改。
import javax.servlet.http.HttpServletRequest;
// 改为
import jakarta.servlet.http.HttpServletRequest;
Spring Native
Spring Native 也是升级的一个重大特性,支持使用 GraalVM 将 Spring 的应用程序编译成本地可执行的镜像文件,可以显著提升启动速度、峰值性能以及减少内存使用。
我们传统的应用都是编译成字节码,然后通过 JVM 解释并最终编译成机器码来运行,而 Spring Native 则是通过 AOT 提前编译为机器码,在运行时直接静态编译成可执行文件,不依赖 JVM。
关于 AOT 技术,参考文章:这样优化Spring Boot,启动速度快到飞起!。
二、3.0 的变更
3.0 的关键变更
Spring Boot 3.0有一些关键改变,这些改变将与大多数应用程序有关。所以开发者要仔细阅读这些变更。
日志日期格式变更
Logback和Log4j2的日志消息的日期和时间部分的默认格式已经改变,以符合 ISO-8601标准 。新的默认格式 yyyy-MM-dd'T'HH:mm:ss.SSSXXX
使用T来分隔日期和时间,而不是空格字符,并在最后添加时区偏移。LOG_DATEFORMAT_PATTERN
环境变量或 logging.pattern.dateformat
属性 可以用来恢复以前的默认值 yyyy-MM-dd HH:mm:ss.SSS
。
ConstructingBinding注解
当使用构造函数绑定 @ConfigurationProperties
时,如果类有单个参数化的构造函数,则不再需要 @ConstructorBinding
注释。如果您有多个构造函数,您仍然需要使用 @ConstructorBinding
来告诉Spring Boot使用哪个构造函数。
对于大多数用户,这种更新后的逻辑将允许更简单的 @ConfigurationProperties
类。但是,如果您有一个 @ConfigurationProperties
,并且希望将bean注入构造函数而不是绑定它,那么您现在需要添加一个 @Autowired
注释。
YamlJsonParser被移除
因为SnakeYAML的JSON解析与其他解析器的实现不一致。如果你直接使用YamlJsonParser,请迁移到其他JsonParser实现中。
自动配置文件变更
Spring Boot 2.7引入了一个新的文件:
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
用于注册自动配置,同时保持与 spring.factories 中注册的向后兼容。Spring Boot 3.0发布后,spring.factories已经被移除,只能通过imports文件来注册自动配置。
Spring Data JDBC 更灵活的 自动配置
Spring Data JDBC的自动配置现在更加灵活。Spring Data JDBC所需的几个自动配置bean现在是有条件的,可以通过定义相同类型的bean来替换。现在可以替换的bean类型如下:
-
org.springframework.data.jdbc.core.JdbcAggregateTemplate
-
org.springframework.data.jdbc.core.convert.DataAccessStrategy
-
org.springframework.data.jdbc.core.convert.JdbcConverter
-
org.springframework.data.jdbc.core.convert.JdbcCustomConversions
-
org.springframework.data.jdbc.core.mapping.JdbcMappingContext
-
org.springframework.data.relational.RelationalManagedTypes
-
org.springframework.data.relational.core.dialect.Dialect
使用Apache Kafka启用异步ack
一个新的配置属性 spring.kafka.listener.async-acks
,用于在Kafka中启用async acks。要启用异步ack,请将该属性设置为 true
。该属性仅适用于 spring.kafka.listener.async-mode
设置为 manual
或 manual-immediate
。
Elasticsearch Java Client
新的 Elasticsearch Java客户端 的自动配置。它可以使用现有的 spring.elasticsearch.*
配置属性。
JdkClientHttpConnector 的 自动装配
在没有Reactor Netty、Jetty的响应式客户机和Apache HTTP客户机的情况下, JdkClientHttpConnector
现在将自动配置。这允许 WebClient
与JDK的 HttpClient
一起使用。
@SpringBootTest 主要方法
@SpringBootTest
注解现在可以使用任何发现可用的 @SpringBootConfiguration
类的 main
,如果它可用的话。这意味着您的 main方法执行的任何自定义 SpringApplication
配置现在都可以由测试获取。
要使用测试的 main
方法,请将 @SpringBootTest
的 useMainMethod
属性设置为 UseMainMethod.ALWAYS
或 UseMainMethod.WHEN_AVAILABLE
。
The
@SpringBootTest
annotation can now use themain
of any discovered@SpringBootConfiguration
class if it’s available. This means that any customSpringApplication
configuration performed by your main method can now be picked up by tests.
To use the main method for a test set theuseMainMethod
attribute of@SpringBootTest
toUseMainMethod.ALWAYS
orUseMainMethod.WHEN_AVAILABLE
.
官方参考文档:Using the Test Configuration Main Method
其他
除了上面列出的改动外,还有一些小的调整和改进,包括:
-
自定义Banner只支持文本类型(banner.txt),不再支持图片类型。
-
在应用程序启动期间不再记录主机名。这防止了网络查找,有助于提高启动时间。
-
在JDK中弃用后,对Java的
SecurityManager
的支持已被删除。 -
Spring Framework 6 中移除
CommonsMultipartResolver
的同时,对他的支持也被移除。 -
spring.mvc.ignore-default-model-on-redirect
已被弃用,已与 Spring Framework 的更改保持一致。 -
WebJars 资源处理程序路径模式可以使用
spring.mvc.webjars-path-pattern
或spring.webflux.webjars-path-pattern
。 -
Tomcat 远程 IP 阀的可信代理可以使用
server.Tomcat.Remoteip.trust-proxy
配置。 -
现在可以通过定义
ValidationConfigurationCustomizer
来定义 Bean 的校验。 -
Log4j2的
Log4jBridgeHandler
现在用于将基于 JUL 的日志路由到 Log4j2,而不是通过 SLF4J 路由。 -
实现
MeterBinder
接口的 Bean 现在只有在所有单例 Bean 初始化之后才绑定到meter registries。 -
用于 Brave 和 OpenTelemetry 的
SpanCustomizer
bean 现在会自动装配 -
Micrometer 的
JvmCompilationMetrics
现在会自动装配。 -
DiskSpaceHealthIndicator
现在其日志消息中包含路径及其健康详细信息。 -
现在可以从包装的
DataSource
派生DataSourceBuilder
。 -
现在可以使用
spring.data.mongodb.additional-hosts
属性为 MongoDB 配置多个 host。 -
可以使用
spring.elasticsearch.socket-keep-alive
属性配置 Elasticsearch 的 socketKeepAlive 属性。 -
在使用
spring-rabbit-stream
时,RabbitStreamTemplate
和Environment
现在将自动装配,无论spring.rabbitmq.listener.type
是否是stream
。 -
已有的 Kafka 主题可以使用
spring.kafka.admin.modify-topic-configs
进行修改。 -
WebDriverScope
和WebDriverTestExectionListener
现在是 public,以方便在自定义测试配置中使用WebDriver
。
Web应用变更
路径匹配
现在Spring MVC和Spring Webflux 的路径匹配规则已经做了调整,默认情况下尾部斜杠/的匹配机制将和以前不同:
-
3.0以前
/foo/bar
等同于/foo/bar/
-
3.0以后
/foo/bar
不同于/foo/bar/
弃用配置 server.max-http-header-size
server.max-http-header-size
已经被弃用,现在用 server.max-http-request-header-size
替代 ,并且现在该属性只能来配置请求头的大小,不再限制某些Web容器的响应头大小,如果需要限制响应头大小请通过自定义WebServerFactoryCustomizer来实现。
优雅停机阶段 变更
优雅停机由SmartLifecycle实现,在SmartLifecycle.DEFAULT_PHASE - 2048阶段开始,Web服务器在SmartLifecycle.DEFAULT_PHASE - 1024阶段停止。任何参与优雅关机的SmartLifecycle实现都应该被相应地更新。
Jetty
由于Jetty目前还不支持Servlet 6.0,使用Jetty的开发者需要通过降低Jakarta Servlet的版本为5.0。
数据访问相关的变更
spring.data
前缀已被保留给Spring Data项目,如果你使用了Spring Data项目的子项目, application.yaml
中相关的配置属性就需要响应的变更。例如 spring.redis
现在需要修改为 spring.data.redis
。
数据访问相关的组件现在都使用了比较新的版本:
-
Flyway更新到 9.0
-
Hibernate 更新到 6.1
-
R2DBC 更新到 1.0
Mongodb
另外 Flapdoodle 嵌入式 MongoDB 的自动配置被移除,开发者有需要的话需要自行引入。
Elasticsearch
Elasticsearch的Rest客户端采用了新的API实现,旧的自动配置和Spring Data Elasticsearch中旧的客户端API已经被移除。
可观测性
Micrometer 升级
Micrometer Observation API 的 自动装配
Spring Boot 3.0 支持 Micrometer 1.10 中引入的新的 Observation API,新的 ObservationRegistry
接口可用于创建观察,它为 metrics
和 traces
提供单一的API。Spring Boot 现在为您自动配置一个 ObservationRegistry 实例。官方文档:Observability
Micrometer Tracing 的 自动装配
Spring Boot 现在自动配置 Micrometer Tracing。这包括对 Brave、OpenTelemetry、Zipkin 和 Wavefront的支持。
当使用 Micrometer Observation API 时,完成观测后,向 Zipkin 或 Wavefront 上报 spans。Tracing 可以通过 在属性 management.tracing
进行控制。Zipkin 可以配置为 management.zipkin.tracing
,而 Wavefront 使用 management.wavefront
。
Micrometer’s OtlpMeterRegistry 的 自动装配
OtlpMeterRegistry
现在 io.micrometer:micrometer-registry-otlp
在类路径上。可以使用 配置表注册表 management.otlp.metrics.export.*
属性。
Prometheus 支持
Prometheus Exemplars 的 自动装配
当存在 Micrometer Tracing Tracer
bean 并且 Prometheus 位于类路径中时,SpanContextSupplier
现在是自动配置的。该 supplier 通过当前 trace ID 和 span ID 使得Prometheus 将 metrics 与 traces 链接起来。
When there is a Micrometer Tracing
Tracer
bean and Prometheus is on the classpath, aSpanContextSupplier
is now auto-configured. This supplier links metrics to traces by making the current trace ID and span ID available to Prometheus.
Making a PUT to Prometheus Push Gateway on Shutdown
Push Gateway 可以配置为 perform a PUT on shutdown。为此,设置management.prometheus.metrics.export.pushgateway.shutdown-operation 给 PUT 。此外,现有的 push 已弃用,现在应该使用 post 代替。
The Push Gateway can be configured to perform a PUT on shutdown. To do so, set management.prometheus.metrics.export.pushgateway.shutdown-operation to put. Additionally, the existing push setting has been deprecated and post should now be used instead.
第三方库升级
Spring Boot 3.0 构建基于 Spring Framework 6 之上,需要使用 Spring Framework 6。Spring Framework 6 新特性
Spring项目
在这个版本中升级的其他Spring项目包括:
-
Spring Security 6.0 (see also what’s new).
Java EE
Spring Boot 3.0已经从Java EE迁移到所有依赖的Jakarta EE api。只要可能,都会选择Jakarta EE 10兼容的依赖项,包括:
-
Jakarta Activation 2.1
-
Jakarta JMS 3.1
-
Jakarta JSON 2.1
-
Jakarta JSON Bind 3.0
-
Jakarta Mail 2.1
-
Jakarta Persistence 3.1
-
Jakarta Servlet 6.0
-
Jakarta Servlet JSP JSTL 3.0
-
Jakarta Transaction 2.0
-
Jakarta Validation 3.0
-
Jakarta WebSocket 2.1
-
Jakarta WS RS 3.1
-
Jakarta XML SOAP 3.0
-
Jakarta XML WS 4.0
第三方jar
我们还尽可能地将第三方jar升级到最新的稳定版本。一些值得注意的依赖升级包括:
-
Couchbase Client 3.4
-
Elasticsearch Client 8.5
-
Groovy 4.0
-
Hibernate Validator 8.0
-
Jackson 2.14
-
Jersey 3.1
-
Jetty 11
-
jOOQ 3.16
-
Kotlin 1.7.20
-
Neo4j Java Driver 5.2
-
Netty 4.1.77.Final
-
SnakeYAML 1.32
-
Tomcat 10
-
Thymeleaf 3.1.0.M2
-
Undertow 2.2.20.Final
其它变更
可观测性、度量跟踪、Maven、Gradle也都有不同程度的变更,有需要可以查看官方的 Spring-Boot-3.0-Migration-Guide 。