Spring Boot 3.0 正式发布!强啊!
The following article is from 艾小仙 Author 艾小仙
如若转载请联系原公众号
所以今天准备用一篇文章的篇幅来梳理总结一波,一起来看一看新版本到底有哪些变化。
基于Java 17和支持Java 19
Spring Boot 3.0使用Java 17作为最低版本,如果用户目前使用的是Java 8或Java 11,那么需要升级先升级 JDK,并且新版本已通过JDK 19进行了测试。
GraalVM支持
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 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 Spring Session 2022.0 Spring WS 4.0
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 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
Log4j2增强
这次升级,包含了一些对Log4j2的扩展支持,具体如下,也可以参考官方文档:https://docs.spring.io/spring-boot/docs/3.0.0-SNAPSHOT/reference/html/features.html#features.logging.log4j2-extensions。
配置文件增强
比如下面针对不同环境的配置方式。
<SpringProfile name="staging">
<!-- configuration to be enabled when the "staging" profile is active -->
</SpringProfile>
<SpringProfile name="dev | staging">
<!-- configuration to be enabled when the "dev" or "staging" profiles are active -->
</SpringProfile>
<SpringProfile name="!production">
<!-- configuration to be enabled when the "production" profile is not active -->
</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
中。
@ConstructorBinding检测优化
以前如果希望属性绑定到类中,我们通过使用@ConfigurationProperties
和@ConstructorBinding
注解可以做到。
新版本针对该注解做了优化,当使用构造函数绑定@ConfigurationProperties
时,如果类只有一个参数的构造函数,则不再需要@ConstructorBinding
注解。
如果有多个构造函数,那么仍然需要使用@ConstructorBinding
来告诉Spring Boot应该使用哪个构造函数。
Micrometer升级
Spring Boot 3.0支持Micrometer 1.10中引入的新的Observation API,新的ObservationRegistry
提供一个API就可以创建metrics
和trace
,新版本Spring Boot现在将会自动装配ObservationRegistry
,并且可以使用ObservationRegistryCustomizer
进一步定制化ObservationRegistry
。
可以参考官方文档:https://docs.spring.io/spring-boot/docs/3.0.0-SNAPSHOT/reference/html/actuator.html#actuator.observability。
Micrometer Tracing自动装配
Spring Boot现在自动装配Micrometer Tracing,包括对Brave,OpenTelemetry,Zipkin和Wavefron的支持。
另外,当引入io.micrometer:micrometer-registry-otlp
包之后,OtlpMeterRegistry
也会自动装配。
细节可参考官方文档:https://docs.spring.io/spring-boot/docs/3.0.0-SNAPSHOT/reference/html/actuator.html#actuator.micrometer-tracing
Prometheus 支持
如果存在Prometheus依赖和Tracer Bean,将会自动装配SpanContextSupplier
,SpanContextSupplier
将会把metrics
关联到trace
,因为它会把当前的traceID
和spanID
保存到Prometheus的Example中。
更灵活的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
Kafka异步ACK支持
现在可以通过设置spring.kafka.listener.async-acks=true
来开启Kafka的异步ACK,并且需要设置spring.kafka.listener.async-mode
为manual
或manual-immediate
。
新的Elasticsearch JAVA客户端支持
支持新版本的ES JAVA客户端自动装配,可以通过属性spring.elasticsearch.*
来配置。
JdkClientHttpConnector自动装配
如果没有Netty Reactor、Jetty reactive client和Apache HTTP client,将自动装配JdkClientHttpConnector
,这允许WebClient
和JDK的HttpClient
一起使用。
@SpringBootTest优化升级
现在任何@SpringBootConfiguration
中的main
方法都可以使用@SpringBootTest
注解,但是需要将@SpringBootTest
的useMainMethod
属性设置为UseMainMethod.ALWAYS
或者UseMainMethod.WHEN_AVAILABLE
。
杂七杂八
除了上面列出的改变之外,还有一些小的调整和优化,包括:
在应用程序启动时候不再记录Host Name,可以提高启动速度,缩短网络查找的耗时。 移除了对SecurityManager的支持。 在Spring Framework6中移除 CommonsMultipartResolver
之后,对它的支持也被移除了。为了保持和Spring 6版本一致,不再推荐使用 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.<product>
,推荐使用management.<product>.metrics.export
。management.prometheus.metrics.export.pushgateway.shutdown-operation
支持POST。@AutoConfigureMetrics
已被弃用,推荐使用@AutoConfigureObservability
。
总体来说,这次大版本的更新还是带来了不少新的改变,除此之外,更多详细的特性/更新也可参看对应的Release Note:https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Release-Notes。
程序员专属卫衣
商品直购链接
👇👇
【☝🏼点击查看更多详情】
推荐阅读:
76 张图,剖析 Spring AOP 源码,小白居然也能看懂,大神,请收下我的膝盖!
Spring Boot 请求路径可以定义成 /**/** 这种格式吗?