Spring Boot 3.0 使用 Java 17作为最低版本,如果版本低于17,那么首先要升级你的JDK到JDK17。
如果你要使用Native Image特性,要使用GraalVM 22.3以上和 Native Build Tools Plugin 0.9.17 或更高的版本。
另外一个很重要的变化就是本次升级之后,最低只支持 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 也是升级的一个重大特性,支持使用 GraalVM 将 Spring 的应用程序编译成本地可执行的镜像文件,可以显著提升启动速度、峰值性能以及减少内存使用。
我们传统的应用都是编译成字节码,然后通过 JVM 解释并最终编译成机器码来运行,而 Spring Native 则是通过 AOT 提前编译为机器码,在运行时直接静态编译成可执行文件,不依赖 JVM。
关于 AOT 技术,参考文章:这样优化Spring Boot,启动速度快到飞起!。
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
。
当使用构造函数绑定 @ConfigurationProperties
时,如果类有单个参数化的构造函数,则不再需要 @ConstructorBinding
注释。如果您有多个构造函数,您仍然需要使用 @ConstructorBinding
来告诉Spring Boot使用哪个构造函数。
对于大多数用户,这种更新后的逻辑将允许更简单的 @ConfigurationProperties
类。但是,如果您有一个 @ConfigurationProperties
,并且希望将bean注入构造函数而不是绑定它,那么您现在需要添加一个 @Autowired
注释。
因为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所需的几个自动配置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
一个新的配置属性 spring.kafka.listener.async-acks
,用于在Kafka中启用async acks。要启用异步ack,请将该属性设置为 true
。该属性仅适用于 spring.kafka.listener.async-mode
设置为 manual
或 manual-immediate
。
新的 Elasticsearch Java客户端 的自动配置。它可以使用现有的 spring.elasticsearch.*
配置属性。
在没有Reactor Netty、Jetty的响应式客户机和Apache HTTP客户机的情况下, JdkClientHttpConnector
现在将自动配置。这允许 WebClient
与JDK的 HttpClient
一起使用。
@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
。
现在Spring MVC和Spring Webflux 的路径匹配规则已经做了调整,默认情况下尾部斜杠/的匹配机制将和以前不同:
3.0以前 /foo/bar
等同于 /foo/bar/
3.0以后 /foo/bar
不同于 /foo/bar/
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目前还不支持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
另外 Flapdoodle 嵌入式 MongoDB 的自动配置被移除,开发者有需要的话需要自行引入。
Elasticsearch的Rest客户端采用了新的API实现,旧的自动配置和Spring Data Elasticsearch中旧的客户端API已经被移除。
Spring Boot 3.0 支持 Micrometer 1.10 中引入的新的 Observation API,新的 ObservationRegistry
接口可用于创建观察,它为 metrics
和 traces
提供单一的API。Spring Boot 现在为您自动配置一个 ObservationRegistry 实例。官方文档:Observability
Spring Boot 现在自动配置 Micrometer Tracing。这包括对 Brave、OpenTelemetry、Zipkin 和 Wavefront的支持。
当使用 Micrometer Observation API 时,完成观测后,向 Zipkin 或 Wavefront 上报 spans。Tracing 可以通过 在属性 management.tracing
进行控制。Zipkin 可以配置为 management.zipkin.tracing
,而 Wavefront 使用 management.wavefront
。
OtlpMeterRegistry
现在 io.micrometer:micrometer-registry-otlp
在类路径上。可以使用 配置表注册表 management.otlp.metrics.export.*
属性。
当存在 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.
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 AMQP 3.0.
Spring Batch 5.0.
Spring Data 2022.0.
Spring GraphQL 1.1.
Spring HATEOAS 2.0.
Spring Integration 6.0.
Spring Kafka 3.0.
Spring LDAP 3.0.
Spring REST Docs 3.0.
Spring Retry 2.0.
Spring Security 6.0 (see also what’s new).
Spring Session 3.0
Spring WS 4.0.
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升级到最新的稳定版本。一些值得注意的依赖升级包括:
Couchbase Client 3.4
Ehcache 3.10
Elasticsearch Client 8.5
Flyway 9
Groovy 4.0
Hibernate 6.1
Hibernate Validator 8.0
Jackson 2.14
Jersey 3.1
Jetty 11
jOOQ 3.16
Kotlin 1.7.20
Liquibase 4.13
Lettuce 6.2
Log4j 2.18
Logback 1.4
Micrometer 1.10
Micrometer Tracing 1.0
Neo4j Java Driver 5.2
Netty 4.1.77.Final
OkHttp 4.10
R2DBC 1.0
Reactor 2022.0
SLF4J 2.0
SnakeYAML 1.32
Tomcat 10
Thymeleaf 3.1.0.M2
Undertow 2.2.20.Final
可观测性、度量跟踪、Maven、Gradle也都有不同程度的变更,有需要可以查看官方的 Spring-Boot-3.0-Migration-Guide 。
Spring Boot 3.0 Release Notes
Spring Boot 3.0 Migration Guide