Springboot3.0新特性解读
官网
版本信息查看
https://start.spring.io/actuator/info
发行说明
Spring Boot 3.0 Release Notes · spring-projects/spring-boot Wiki · GitHub
从 Spring Boot 2.7 升级
由于这是 Spring Boot 的一个主要版本,因此升级现有应用程序可能比平时更复杂一些。我们整理了一份专门的迁移指南,以帮助您升级现有的 Spring Boot 2.7 应用程序。
如果您当前运行的是早期版本的 Spring Boot,我们强烈建议您先升级到 Spring Boot 2.7,然后再迁移到 Spring Boot 3.0。
2.7~3.0版本更新
新的配置和值得注意的
springboot3.0后相关配置修改(废弃,默认值变更,key修改)
Java 17 基线和 Java 19 支持
Spring Boot 3.0 要求 Java 17 作为最低版本。如果您当前使用的是 Java 8 或 Java 11,则需要先升级 JDK,然后才能开发 Spring Boot 3.0 应用程序。
Spring Boot 3.0 也运行良好,并已通过 JDK 19 测试。
jdk17下载安装
https://download.oracle.com/java/17/latest/jdk-17_windows-x64_bin.exe
GraalVM 基线和本机构建工具
Spring Boot 需要 Graal 22.3 或更高版本和 Native Build Tools Plugin 0.9.17 或更高版本
ps: 更好的支持云原生,打出镜像更小(不依赖jvm),启动的更快(预编译)
GraalVM 是 Oracle 在 2018 年发布的一个全新的通用全栈虚拟机,并具有高性能、跨语言交互等逆天特性,不仅支持了 Java、Scala、Groovy、Kotlin 等基于 JVM 的语言,以及 C、C++ 等基于 LLVM 的语言,还支持其他像 JavaScript、Ruby、Python 和 R 语言等
第三方库升级
Spring Boot 3.0 基于并需要 Spring Framework 6。您可能想阅读Spring Framework 6.0 中可用的新功能。
此版本中升级的其他 Spring 项目包括:
-
Spring Security 6.0 (see also what’s new).
支持Jakarta EE 10
包名javax改为jakarta (捐献给了 eclipse进行维护,因此包名需要进行修改)
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
支持Tomcat 10.x版本
Apache Tomcat项目很自豪地宣布Apache Tomcat10.1.1版本的发布。此版本实现了Jakarta EE 10 平台的一部分规范。在 Tomcat 9 及更早版本上运行的应用程序如果不进行更改,将无法在 Tomcat 10 上运行。为 Tomcat 9 及更早版本设计的基于 Java EE 的应用程序可以放在
$CATALINA_BASE/webapps-javaee
目录中,Tomcat 会自动将它们转换为Jakarta EE 并将它们复制到 web 应用程序目录。此转换是使用 Jakarta EE工具的Apache Tomcat迁移工具 执行的,该工具也可单独下载 以供离线使用。
GraalVM 本机图像支持
Spring Boot 3.0 应用程序现在可以转换为 GraalVM 原生镜像,这可以提供显着的内存和启动性能改进。支持 GraalVM Native Images 是整个 Spring 产品组合中的一项重大工程工作。
要开始使用 GraalVM 原生图像,请参阅更新后的 Spring Boot 参考文档。
Log4j2 增强功能
Log4j2 支持已更新为提供以下功能的新扩展:
- 配置文件特定的配置
- 环境属性查找
- Log4j2 系统属性
有关详细信息,请参阅更新的文档。
改进的@ConstructorBinding 检测
使用构造函数绑定时,如果类具有单个参数化构造函数,则不再需要注释@ConfigurationProperties
。@ConstructorBinding
如果您有多个构造函数,您仍然需要使用@ConstructorBinding
来告诉 Spring Boot 使用哪一个。
对于大多数用户来说,这个更新后的逻辑将允许使用更简单的@ConfigurationProperties
类。但是,如果您有一个@ConfigurationProperties
并且想要将 bean 注入构造函数而不是绑定它,那么您现在需要添加一个@Autowired
注释
Micrometer Updates
Micrometer Observation API 的自动配置
Spring Boot 3.0 支持 Micrometer 1.10 中引入的新观察 API。新ObservationRegistry
接口可用于创建观察,它为指标和跟踪提供单一 API。ObservationRegistry
Spring Boot 现在为您自动配置一个实例。
如果micrometer-core
在类路径上,aDefaultMeterObservationHandler
注册在 上ObservationRegistry
,这意味着每次停止都会Observation
导致一个计时器。 ObservationPredicate
,GlobalObservationConvention
并ObservationHandler
自动注册在ObservationRegistry
. 如果需要,您可以使用ObservationRegistryCustomizer
它来进一步自定义。ObservationRegistry
有关详细信息,请参阅参考文档的新“可观察性”部分。
监控跟踪的自动配置
Spring Boot 现在为您自动配置Micrometer Tracing 。这包括对 Brave、OpenTelemetry、Zipkin 和 Wavefront 的支持。
使用 Micrometer Observation API 时,完成观察将导致报告给 Zipkin 或 Wavefront 的跨度。可以使用 下的属性控制跟踪management.tracing
。Zipkin 可以配置为management.zipkin.tracing
,而 Wavefront 使用management.wavefront
.
更多详细信息,包括您需要添加的各种依赖项,请参见参考文档的跟踪部分。
Micrometer 的 OtlpMeterRegistry 的自动配置
An现在在类路径上OtlpMeterRegistry
时自动配置。io.micrometer:micrometer-registry-otlp
仪表注册表可以使用management.otlp.metrics.export.*
属性进行配置。
普罗米修斯支持
Prometheus 示例的自动配置
当有一个 Micrometer Tracing Tracer
bean 并且 Prometheus 在类路径上时,aSpanContextSupplier
现在是自动配置的。该供应商通过使当前跟踪 ID 和跨度 ID 可用于 Prometheus 将指标链接到跟踪。
在关闭时对 Prometheus Push Gateway 进行 PUT
Push Gateway 可以配置为在关闭时执行PUT。为此,请设置management.prometheus.metrics.export.pushgateway.shutdown-operation
为put
。此外,现有push
设置已被弃用,post
现在应该改用。
更灵活的 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 启用异步确认
spring.kafka.listener.async-acks
添加了一个新的配置属性,用于启用与 Kafka 的异步确认。要启用异步确认,请将属性设置为true
. 该属性仅在spring.kafka.listener.async-mode
设置为manual
或时适用manual-immediate
。
弹性搜索 Java 客户端
引入了新的 Elasticsearch Java 客户端的自动配置。它可以使用现有的spring.elasticsearch.*
配置属性进行配置。
JdkClientHttpConnector 的自动配置
在没有 Reactor Netty 的情况下,Jetty 的反应式客户端和 Apache HTTP 客户端JdkClientHttpConnector
现在将自动配置。这允许WebClient
与 JDK 的HttpClient
.
@SpringBootTest 与主要方法
如果可用,注释@SpringBootTest
现在可以使用main
任何已发现的类。@SpringBootConfiguration
这意味着SpringApplication
您的 main 方法执行的任何自定义配置现在都可以通过测试获取。
要将该main
方法用于测试,请将useMainMethod
属性设置@SpringBootTest
为UseMainMethod.ALWAYS
或UseMainMethod.WHEN_AVAILABLE
。
有关详细信息,请参阅更新的参考文档。
Spring Reactive Web开发参考
Getting Started | Building a Reactive RESTful Web Service
Spring6.0提供HTTP Interfaces新特性,类似于SpringData的Repository或者SpringCloud OpenFeign一样,从而更高效的实现WebFlux开发。
Spring6.0 HTTP Interfaces官方地址。
其他改动
除了上面列出的更改外,还有一些小的调整和改进,包括:
- 在应用程序启动期间不再记录主机名。这可以防止有助于缩短启动时间的网络查找。
SecurityManager
在 JDK 中弃用 Java 后,已删除对它的支持。- 在 Spring Framework 6 中移除后,对 Spring Framework 的支持CommonsMultipartResolver`被移除。(原上传方法)
- 已
spring.mvc.ignore-default-model-on-redirect
弃用以与上游 Spring Framework 更改保持一致。 - 可以使用
spring.mvc.webjars-path-pattern
或自定义 WebJars 资源处理程序路径模式spring.webflux.webjars-path-pattern
。 - Tomcat 远程 IP 阀的可信代理可以使用
server.tomcat.remoteip.trusted-proxies
. Configuration
现在可以通过定义一个bean 来自定义Bean 验证ValidationConfigurationCustomizer
。- Log4j2
Log4jBridgeHandler
现在用于将基于 JUL 的日志记录路由到 Log4j2,而不是通过 SLF4J 进行路由。 - 实现该接口的 Bean
MeterBinder
现在仅在初始化所有单例 bean 后才绑定到仪表注册表。 SpanCustomizer
Brave 和 OpenTelemetry 的 beans 现在是自动配置的。- Micrometer and Metrics
JvmCompilationMetrics
现在是自动配置的。 DiskSpaceHealthIndicator
现在在其日志消息及其运行状况详细信息中包含其路径。- A
DataSourceBuilder
现在可以从包装的DataSource
. - 现在可以使用该属性为 MongoDB 配置多个主机
spring.data.mongodb.additional-hosts
。 - Elasticsearch 的 socketKeepAlive 属性可以使用该
spring.elasticsearch.socket-keep-alive
属性进行配置。 - 使用时
spring-rabbit-stream
,aRabbitStreamTemplate
和Environment
现在将自动配置是否spring.rabbitmq.listener.type
为stream
。 - 可以使用 修改现有的 Kafka 主题
spring.kafka.admin.modify-topic-configs
。 WebDriverScope
并WebDriverTestExecutionListener
已公开以简化在自定义测试设置中的使用WebDriver
。
Spring Boot 3.0 中的弃用
@ConstructorBinding
已从org.springframework.boot.context.properties
包中移至org.springframework.boot.context.properties.bind
.JsonMixinModule
基于扫描的构造函数已被弃用。ClientHttpRequestFactorySupplier
应替换为ClientHttpRequestFactories
.comment
不再支持Cookie属性。RestTemplateExchangeTagsProvider
、WebClientExchangeTagsProvider
、WebFluxTagsProvider
和WebMvcTagsProvider
相关类已替换为ObservationConvention
等效类。- 基类上的无参数构造函数
HealthContributor
@Configuration
已被弃用。 DefaultTestExecutionListenersPostProcessor
并且SpringBootDependencyInjectionTestExecutionListener
已被弃用,取而代之的是 Spring Framework 的ApplicationContextFailureProcessor
.- 属性
management.metrics.export.<product>
已弃用,替换为management.<product>.metrics.export
. - 有利于
push
的设定。management.prometheus.metrics.export.pushgateway.shutdown-operation``post
@AutoConfigureMetrics
已被弃用,取而代之的是@AutoConfigureObservability
.