查看原文
其他

Spring Boot 3.0 正式发布!强啊!

脚本之家 2022-12-04

The following article is from 艾小仙 Author 艾小仙

 关注
“脚本之家
”,与百万开发者在一起

本文经艾小仙(id:aixiaoxianren)授权转载

如若转载请联系原公众号

前几天,Spring Boot 3.0发布了第一个正式的GA版本,这次的Spring Boot 3.0是一个大版本更新,新版还是带来了不少的变化和改进的。

所以今天准备用一篇文章的篇幅来梳理总结一波,一起来看一看新版本到底有哪些变化。

基于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就可以创建metricstrace,新版本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,将会自动装配SpanContextSupplierSpanContextSupplier将会把metrics关联到trace,因为它会把当前的traceIDspanID保存到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-modemanualmanual-immediate

新的Elasticsearch JAVA客户端支持

支持新版本的ES JAVA客户端自动装配,可以通过属性spring.elasticsearch.*来配置。

JdkClientHttpConnector自动装配

如果没有Netty Reactor、Jetty reactive client和Apache HTTP client,将自动装配JdkClientHttpConnector,这允许WebClient和JDK的HttpClient一起使用。

@SpringBootTest优化升级

现在任何@SpringBootConfiguration中的main方法都可以使用@SpringBootTest注解,但是需要将@SpringBootTestuseMainMethod属性设置为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-patternspring.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时,RabbitStreamTemplateEnvironment现在将自动装配,无论spring.rabbitmq.listener.type是否是stream
  • 已有的Kafka主题可以使用spring.kafka.admin.modify-topic-configs进行修改。
  • WebDriverScopeWebDriverTestExectionListener现在是public,以方便在自定义测试配置中使用WebDriver

弃用功能

  • ConstructorBinding已经从org.springframework.boot.context.properties包修改为org.springframework.boot.context.properties.bind
  • 已经不推荐使用基于JsonMixinModule扫描的构造函数。
  • ClientHttpRequestFactorySupplier应该替换为ClientHttpRequestFactories
  • 不再支持Cookie注释属性。
  • RestTemplateExchangeTagsProviderWebClientExchangeTagsProviderWebFluxTagsProviderWebMvcTagsProvider和相关类已经被ObservationConvention所取代。
  • HealthContributor@Configuration上的无参构造函数已被弃用。
  • DefaultTestExecutionListenersPostProcessorSpringBootDependencyInjectionTestExecutionListener已被弃用,转而使用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。

今天的梳理总结就先到这里吧,我们下篇见。
<END>

程序员专属卫衣

商品直购链接

👇👇

【☝🏼点击查看更多详情】

  推荐阅读:

墙裂推荐!这才是专属程序员们的T恤!

76 张图,剖析 Spring AOP 源码,小白居然也能看懂,大神,请收下我的膝盖!

SpringBoot的starter到底是什么?

SpringBoot 时间格式化的 5 种实现方法!

Spring Boot 请求路径可以定义成 /**/** 这种格式吗?

Office 2019/2021专业增强版,正版终身授权!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存