官方提供了一个从 2.7 版本升级到 3.0 的指南:https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-Guide,官方建议在升级到 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 使用可以参考:https://docs.spring.io/spring-boot/docs/3.0.0-SNAPSHOT/reference/html/native-image.html#native-image
Spring Boot 3.0 构建基于 Spring Framework 6 之上,需要使用 Spring Framework 6。
该版本中升级的其他 Spring 项目包括:
Spring Boot 3.0 已经从 Java EE
升级为 JakartaEE API
。尽可能选择 JakartaEE10
兼容的依赖:
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
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
这次升级,包含了一些对 Log4j2 的扩展支持,具体如下,也可以参考官方文档:https://docs.spring.io/spring-boot/docs/3.0.0-SNAPSHOT/reference/html/features.html#features.logging.log4j2-extensions。
配置文件增强
比如下面针对不同环境的配置方式。
<SpringProfile name="staging">
</SpringProfile>
<SpringProfile name="dev | staging">
</SpringProfile>
<SpringProfile name="!production">
</SpringProfile>
复制代码
Spring 环境属性增强
支持在 Log4j2 配置中引用 Spring 环境中的属性,使用 Spring:
前缀。
<Properties>
<Property name="applicationName">${spring:spring.application.name}</property>
</Properties>
复制代码
系统属性增强
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
。
SpringBoot 现在自动装配Micrometer Tracing ,包括对 Brave, OpenTelemetry, Zipkin 和 Wavefron 的支持。
另外,当引入io.micrometer:micrometer-registry-otlp
包之后, OtlpMeterRegistry
也会自动装配。
如果存在 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
。
除了上面列出的改变之外,还有一些小的调整和优化,包括:
在应用程序启动时候不再记录 Host Name,可以提高启动速度,缩短网络查找的耗时
移除了对 SecurityManager 的支持。
在Spring Framework6
中移除CommonsMultipartResolver
之后,对它的支持也被移除了。
为了保持和 Spring6 版本一致,不再推荐使用spring.mvc.ignore-default-model-on-redirect
Web Jar 资源处理器 path pattern 可以使用参数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
。
ConstructorBinding
已经从 org.springframework.boot.context.properties
包修改为 org.springframework.boot.context.properties.bind
。
已不推荐使用基于 JsonMixinModule
扫描的构造函数。
ClientHttpRequestFactorySupplier
应该替换为 ClientHttpRequestFactories
。
不再支持 Cookie 注释属性。
RestTemplateExchangeTagsProvider
, WebClientExchangeTagsProvider
, WebFluxTagsProvider
, WebMvcTagsProvider
和相关类已经被ObservationConvention
所取代。
HealthContributor
@Configuration 上的无参构造函数已被弃用。
DefaultTestExecutionListenersPostProcessor
和 SpringBootDependencyInjectionTestExecutionListener
已被弃用,转而使用 Spring 框架的 ApplicationContextFailureProcessor
。
不推荐使用 management.metrics.export.
,推荐使用 management.
。
management.prometheus.metrics.export.pushgateway.shutdown-operation
支持 POST
@AutoConfigureMetrics
已被弃用,推荐使用@AutoConfigureObservability
。