11月24号,Spring Boot 3.0 发布了第一个正式的 GA 版本,一起看看新版本到底有哪些变化。

2.7版本升级指南

官方提供了一个从 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。

新的变化

基于Java17和支持Java19

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 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 包的最新稳定版本,其中一些值得注意的依赖升级包括:

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,新版本 SpringBoot 现在将会自动装配ObservationRegistry,并且可以使用ObservationRegistryCustomizer进一步定制化ObservationRegistry

可以参考官方文档:https://docs.spring.io/spring-boot/docs/3.0.0-SNAPSHOT/reference/html/actuator.html#actuator.observability

Micrometer Tracing 自动装配

SpringBoot 现在自动装配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,因为它会把当前的 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-modemanual or 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注解,但是需要将@SpringBootTestuseMainMethod属性设置为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-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 注释属性。
  • RestTemplateExchangeTagsProvider, WebClientExchangeTagsProvider, WebFluxTagsProvider, WebMvcTagsProvider和相关类已经被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 Notes:https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Release-Notes,如有错误,请指出,谢谢。

这可能是最全的SpringBoot3新版本变化了!的更多相关文章

  1. PHP新版本变化

    世界变化真快,突然听闻 PHP 都到 7.3 版本了,7.2 还没仔细了解过呢.看到我司面试时会问到php新版本有什么特性,美名其曰考察其学习新技术的能力,我有点汗颜,自己都没有主动去了解过,实在不应 ...

  2. 原生JS实现全选和不全选

    案例演示 源代码 <!DOCTYPE html> <html> <head lang="en"> <meta charset=" ...

  3. 第八十二篇:Vue购物车(三) 实现全选功能

    好家伙, 继续完善购物车相应功能 1.如何实现全选和反全选 1.1.全选框的状态显示(父传子) 来一波合理分析: 在页面中,有三个商品中 三个商品中的第二个未选择, 我么使用一个计算属性(fullSt ...

  4. SlickOne -- 基于Dapper, Mvc和WebAPI 的快速开发框架

    前言:在两年前,项目组推出了基于Dapper,Mvc和WebApi的快速开发框架,随着后续Slickflow产品的实践和应用,今再次对SlickOne项目做以回顾和总结.其目的是精简,持续改进,保持重 ...

  5. 兼容发布&小流量概述

    背景 re消息limit上线之前有这样的问题: 1.存量用户,会感知到新功能: 2.后端.前端上线间隔期间,如果没做兼容,涉及到接口数据格式变更,会导致C端拉取数据报错: 3.改模板配置,会导致老信息 ...

  6. SlickOne敏捷开发框架介绍(一) -- 基于Dapper, Mvc和WebAPI 的快速开发框架

    前言:在两年前(最初发布时间:2013年1月9日(csdn),当前文章时间2015年11月10日),项目组推出了基于Dapper,Mvc和WebApi的快速开发框架,随着后续Slickflow产品的实 ...

  7. 学习Geodatabase的总结

    一.怎样择取自己需要的.有用的资料 1.开始找资料时,首先想到的是ESRI的帮助文档,因为它直接.规范而系统.通读一遍之后,大致了解了Geodatabase的各个方面.再从帮助文档体系结构中选出重要的 ...

  8. Java开源诊断工具 Arthas 发布v3.1.0

    Arthas 自2018年9月份上线以来「传送门」,已收获近万个star,感谢开发者们的认可.此次Arthas 3.1.0版本的发布,不仅带来大家投票出来的新LOGO,还带来强大的新功能和更好的易用性 ...

  9. 手把手教你使用 Nginx Ingress 实现金丝雀发布

    概述 本文将介绍如何使用 Nginx Ingress 实现金丝雀发布,从使用场景分析,到用法详解,再到上手实践. 前提条件 集群中需要部署 Nginx Ingress 作为 Ingress Contr ...

  10. IntelliJ IDEA 2020.3正式发布,年度最后一个版本很讲武德

    仰不愧天,俯不愧人,内不愧心.关注公众号[BAT的乌托邦],有Spring技术栈.MyBatis.JVM.中间件等小而美的原创专栏供以免费学习.分享.成长,拒绝浅尝辄止.本文已被 https://ww ...

随机推荐

  1. 天天写SQL,这些神奇的特性你知道吗?

    摘要:不要歪了,我这里说特性它不是 bug,而是故意设计的机制或语法,你有可能天天写语句或许还没发现原来还能这样用,没关系我们一起学下涨姿势. 本文分享自华为云社区<[云驻共创]天天写 SQL, ...

  2. mpdf导出pdf,中文符号乱码

    改源码: 打开vendor/mpdf/mpdf/src/Config/FontVariables.php 在最后一行加入: "gb" => [ 'R' => 'gb.t ...

  3. ACL和NAT

    1 ACL 1.1 ACL的作用 1).用来对数据包做访问控制(丢弃或者放弃) 2).结合其他协议,用来匹配范围 1.2 ACL的工作原理 当数据包从接口经过时,由于接口启用了ACL,此时路由器会对报 ...

  4. Django 连接数据库 MySQL

    一.Django 连接 MySQL 修改 settings.py 文件 # 默认用的是sqlite3 # Database # https://docs.djangoproject.com/en/4. ...

  5. Kubernetes 监控:Prometheus Operator

    安装 前面的章节中我们学习了用自定义的方式来对 Kubernetes 集群进行监控,基本上也能够完成监控报警的需求了.但实际上对上 Kubernetes 来说,还有更简单方式来监控报警,那就是 Pro ...

  6. 车辆稳定性辅助(VSA)系统

    当车辆转弯大于或小于预期时,VSA有助于在转弯时稳定车辆. 同时还有助于在湿滑路面上保持牵引力. VSA 打开和关闭 禁用: 请长按按钮直至听到哔的一声.VSA 关闭指示灯点亮. 恢复: 按下按钮直至 ...

  7. 8. 使用Fluentd+MongoDB采集Apache日志

    Fluentd+MongoDB,用以实时收集半结构化数据. 背景知识 日志接入Fluentd后,会以json的格式在Fluentd内部进行路由.这就决定了Fluentd处理日志的方式是非常灵活的,它将 ...

  8. 7M与N的数学运算

    m=eval(input()) n=eval(input()) a=m+n b=m*n c=m**n d=m%n e=max(m,n) print(a,b,c,d,e)

  9. 企业使用erp系统的好处及解决了什么问题?

    不是所有的企业使用ERP都能带来好处的,尤其是对于一些小微企业,带来的可能是灾难,而实施不适用的系统同样也会带来意想不到的后果,所以在ERP的使用方面得根据自己企业实际做决定.不同规模的企业选用不同的 ...

  10. Linux Subsystem For Android 11!适用于Debian GNU/Linux的Android子系统,完美兼容ARM安卓软件!

    本文将讲述如何在Debian Stable 系统安装一个Android 11子系统,并且这个子系统带有Houdini可以兼容专为移动设备开发的ARM软件.在root权限下,编辑/etc/apt/sou ...