SpringBoot 3.0 变更

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 设置为 manualmanual-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 方法,请将 @SpringBootTestuseMainMethod 属性设置为 UseMainMethod.ALWAYSUseMainMethod.WHEN_AVAILABLE

The @SpringBootTest annotation can now use the main of any discovered @SpringBootConfiguration class if it’s available. This means that any custom SpringApplication configuration performed by your main method can now be picked up by tests.
To use the main method for a test set the useMainMethod attribute of @SpringBootTest to UseMainMethod.ALWAYS or UseMainMethod.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-patternspring.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 时,RabbitStreamTemplateEnvironment 现在将自动装配,无论 spring.rabbitmq.listener.type 是否是 stream

  • 已有的 Kafka 主题可以使用 spring.kafka.admin.modify-topic-configs 进行修改。

  • WebDriverScopeWebDriverTestExectionListener 现在是 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 接口可用于创建观察,它为 metricstraces 提供单一的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, a SpanContextSupplier 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 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.

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

  • 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

你可能感兴趣的:(#,Spring,Boot,3.0,spring,boot,java,后端)