官方提供了一个从 2.7 版本升级到 3.0 的指南:github.com/spring-proj… Spring Boot 3.0 之前先升级到 Spring Boot 2.7。
Spring Boot 3.0 使用 Java 17作为最低版本,如果你目前使用的是 Java 8或 Java 11,那么需要升级先升级 JDK,并且新版本已通过 JDK 19 进行了测试。
Spring Native 也是升级的一个重大特性,支持使用 GraalVM 将 Spring 的应用程序编译成本地可执行的镜像文件,可以显著提升启动速度、峰值性能以及减少内存使用。
关于 GraalVM 使用可以参考:docs.spring.io/spring-boot…
Spring Boot 3.0 构建基于 Spring Framework 6 之上,需要使用 Spring Framework 6。
该版本中升级的其他 Spring 项目包括:
Spring Boot 3.0 已经从 Java EE
升级为 JakartaEE API
。尽可能选择 JakartaEE10
兼容的依赖:
另外,还升级了第三方 jar 包的最新稳定版本,其中一些值得注意的依赖升级包括:
这次升级,包含了一些对 Log4j2 的扩展支持,具体如下,也可以参考官方文档:docs.spring.io/spring-boot…
配置文件增强
比如下面针对不同环境的配置方式。
复制代码
Spring 环境属性增强
支持在 Log4j2配置中引用 Spring 环境中的属性,使用 Spring:
前缀。
${spring:spring.application.name}
复制代码
系统属性增强
Log4j2现在支持更多可配置的 System.properties
。比如,可以使用 log4j2.skipJansi
系统属性来配置 Console Appender
是否在 Windows 上使用 Jansi
输出流。
在 Log4j2 初始化之后加载的所有System.properties
都可以从 SpringEnvironment
拿到。比如上面的举例一样,可以把log4j2.skipJansi = false
配置到 application.properties
中。
以前如果希望属性绑定到类中,我们通过使用@ConfigurationProperties
和@ConstructorBinding
注解可以做到。
新版本针对该注解做了优化,当使用构造函数绑定@ConfigurationProperties
时,如果类只有一个参数的构造函数,则不再需要@ConstructorBinding
注解。
如果有多个构造函数,那么仍然需要使用@ConstructorBinding
来告诉 Spring Boot 应该使用哪个构造函数。
Spring Boot 3.0 支持 Micrometer 1.10 中引入的新的 Observation API,新的 ObservationRegistry
提供一个 API 就可以创建 metrics
和 trace
,新版本 SpringBoot 现在将会自动装配ObservationRegistry
,并且可以使用ObservationRegistryCustomizer
进一步定制化ObservationRegistry
。
可以参考官方文档:docs.spring.io/spring-boot…
SpringBoot 现在自动装配Micrometer Tracing ,包括对 Brave, OpenTelemetry, Zipkin 和 Wavefron 的支持。
另外,当引入io.micrometer:micrometer-registry-otlp
包之后, OtlpMeterRegistry
也会自动装配。
细节参考官方文档:docs.spring.io/spring-boot…
如果存在 Prometheus 依赖和 Tracer
Bean,将会自动装配SpanContextSupplier
,SpanContextSupplier
将会把 metrics 关联到 trace,因为它会把当前的 traceID 和 spanID 保存到 Prometheus 的 Example 中。
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=true
来开启 Kafka 的异步 ACK,并且需要设置spring.kafka.listener.async-mode
为manual
or manual-immediate
。
支持新版本的 ES JAVA 客户端自动装配,可以通过属性spring.elasticsearch.*
来配置。
如果没有 Netty Reactor、Jetty reactive client 和 Apache HTTP client ,将自动装配JdkClientHttpConnector
,这允许WebClient
和 JDK 的HttpClient
一起使用。
现在任何@SpringBootConfiguration
中的main
方法都可以使用@SpringBootTest
注解,但是需要将@SpringBootTest
的useMainMethod
属性设置为UseMainMethod.ALWAYS
或者UseMainMethod.WHEN_AVAILABLE
。
除了上面列出的改变之外,还有一些小的调整和优化,包括:
Spring Framework6
中移除CommonsMultipartResolver
之后,对它的支持也被移除了。spring.mvc.ignore-default-model-on-redirect
spring.mvc.webjars-path-pattern
、 spring.webflux.webjars-path-pattern
自定义server.Tomcat.Remoteip.trust-proxy
配置。ValidationConfigurationCustomizer
来自定义 Bean 的校验。Log4jBridgeHandler
现在用于将基于 JUL 的日志路由到 Log4j2,而不是通过 SLF4J 路由。MeterBinder
接口的 Bean 现在只有在所有单例 Bean 初始化之后才绑定到meter registries。SpanCustomizer
bean 现在会自动装配JvmCompilationMetrics
现在会自动装配。DiskSpaceHealthIndicator
现在其日志消息中包含路径及其健康详细信息。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
。spring.kafka.admin.modify-topic-configs
进行修改。WebDriverScope
和 WebDriverTestExectionListener
现在是 public,以方便在自定义测试配置中使用 WebDriver
。ConstructorBinding
已经从 org.springframework.boot.context.properties
包修改为 org.springframework.boot.context.properties.bind
。JsonMixinModule
扫描的构造函数。ClientHttpRequestFactorySupplier
应该替换为 ClientHttpRequestFactories
。RestTemplateExchangeTagsProvider
, WebClientExchangeTagsProvider
, WebFluxTagsProvider
, WebMvcTagsProvider
和相关类已经被ObservationConvention
所取代。HealthContributor
@Configuration 上的无参构造函数已被弃用。DefaultTestExecutionListenersPostProcessor
和 SpringBootDependencyInjectionTestExecutionListener
已被弃用,转而使用 Spring 框架的 ApplicationContextFailureProcessor
。management.metrics.export.
,推荐使用 management..metrics.export
。management.prometheus.metrics.export.pushgateway.shutdown-operation
支持 POST@AutoConfigureMetrics
已被弃用,推荐使用@AutoConfigureObservability
。