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.JdbcAggregateTemplateorg.springframework.data.jdbc.core.convert.DataAccessStrategyorg.springframework.data.jdbc.core.convert.JdbcConverterorg.springframework.data.jdbc.core.convert.JdbcCustomConversionsorg.springframework.data.jdbc.core.mapping.JdbcMappingContextorg.springframework.data.relational.RelationalManagedTypesorg.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-redirectWeb 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的 SpanCustomizerbean现在会自动装配。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 请求路径可以定义成 /**/** 这种格式吗?