Spring Boot 3.0.0正式发布,Banner不再支持图片&增强可观测性

Spring Boot 3.0.0正式发布,Banner不再支持图片&增强可观测性

如果把2014年发布1.0版比作Spring团队的再次创业,发布后火爆程度可谓风靡全球。到2018年发布2.0版本,已经完全没有对手了。今年刚发布的3.0版本直接上Java 17以及Jakarta EE 9起步,可谓站稳脚跟后的引领风骚。

what’s new(新特性)

老规矩,将我们关心的功能爽一遍。

最低版本要求

Spring Boot 3.0.0对外部依赖有最低版本要求:

  1. JDK 17
  2. Graal 22.3
  3. Native Build Tools Plugin 0.9.17
  4. Spring Framework 6

借助Micrometer大大提升可观测性

据说,Spring Boot内部有专门一个“团队”来做应用的可观性,本次的借助的升级,使得可观测这件事在Spring Framework 6和Spring Boot 3.0.0内部都变得更加简单、易用!通过可观测性,能更好的了解系统内部的运行状态,做到胸有成竹。

Micrometer 1.10中引入的新的,它使得一个API就能搞定:metrics、tracing、logging指标观测,并且还能传递上下文、传播元数据等等,对使用者非常友好。

这个API的设计是降低使用门槛,希望用户使用单一API,就能从中获取到多种信息:metrics、tracing、logging

笔者窥探了一下Spring Boot针对Micrometer源代码级别的变化,觉得值得用专题来做较为完整的表述,结合自己的一些使用经验,尽量去说清楚在项目中如何使用它来方便的观测你的Application。

Log4j2增强

一句话:配置性更灵活、和Spring环境整合得更好了。

PS:一般情况下使用默认的logback即可。倘若你不是典型的高并发场景,不建议折腾Log4j2

spring-web URL的匹配规则有变化

声明:这项特性更改和Spring Boot无关,属于Spring Framework 6的变更

包含Spring MVC和WebFlux在内的URL 尾部斜杠 匹配方式,本次有调整:可参见类

Spring Boot 3.0.0正式发布,Banner不再支持图片&增强可观测性
值得注意的是:只是删除了作为自动配置文件的支持,而不是不再支持这种SPI语法了。毕竟像什么、、等加载实现类的方式用还是非常方便的。

Spring Boot此举,笔者觉得目的就想将自动配置文件的配置,和其它SPI配置分离(顺便做做简化),仅此而已

@ConstructingBinding不能再标注在类上

从源代码的角度看,改注解已经不能再被标注在类上了(编译不通过):

Spring Boot 3.0.0正式发布,Banner不再支持图片&增强可观测性

配置文件里写好属性的k-v:

通过将属性文件加载进容器:

文件结构如下:

Spring Boot 3.0.0正式发布,Banner不再支持图片&增强可观测性
在Spring Boot 3.0.0版本运行结果为:正常
Spring Boot 3.0.0正式发布,Banner不再支持图片&增强可观测性
从IDEA飘红提示来看,这种用法就不对嘛。再次运行容器:

在Spring Boot 2.7.x里运行结果为:报错

Spring Boot 3.0.0正式发布,Banner不再支持图片&增强可观测性
我在网上看到一篇写Spring Boot 3.0.0新特性的文章说到:这项新特性部分支持,不建议使用!嗨,这个误导性就比较强了。

说白了不是Spring Boot 3.0.0部分支持,而是使用者对属性类Bean的使用姿势不对:这从Spring Boot 3.0.0的报错提示能看出端倪,明显比2.7.x版本的报错指向性更好,明确告诉了你原因依旧修复方式。

值得一提的是,如果编码时这么使用,连IntelliJ IDEA都不同意:非常明显的指出了问题所在:

Spring Boot 3.0.0正式发布,Banner不再支持图片&增强可观测性
注意:此属性只在当的时候才生效。
Spring Boot 3.0.0正式发布,Banner不再支持图片&增强可观测性
它的含义为:
Spring Boot 3.0.0正式发布,Banner不再支持图片&增强可观测性
测试类:
Spring Boot 3.0.0正式发布,Banner不再支持图片&增强可观测性
可以看到完完整整的执行了main方法(启动了应用),因此只要main方法能够执行到的代码、扫到的配置、加载到的Bean,都会被放入到测试上下文里。

程序启动期间,不再查找主机名

2.7.x版本:启动日志包含主机名

Spring Boot 3.0.0正式发布,Banner不再支持图片&增强可观测性
代码差异体现在:
Spring Boot 3.0.0正式发布,Banner不再支持图片&增强可观测性
这段逻辑干掉后,Spring Boot应用的启动速度应该会有比较明显的提升,收获比较大。

不再使用JDK的SecurityManager

Java 17中,SecurityManager遭到弃用。同理,最低要求Java 17的Spring Boot 3.0.0也无理由再使用它了。

以Spring Boot的类举例:上下对比可看出区别

Spring Boot 3.0.0正式发布,Banner不再支持图片&增强可观测性
可以看到,Spring Boot 3.0.0直接干掉了这个实现类。因此现在类路径下的等图片文件都将被忽略,反馈归真,只支持文本类Banner了!

PS:有兴趣的同学可以看看ImageBanner的实现,很高级且很复杂,当然也很耗时。看完就明白这个版本为啥要干掉它了~

JMX默认也只暴露Health端点了

从Spring Boot 2.7开始,web端点默认只暴露health,这次JMX也来跟着保持一致了。

如若需要显示控制其它端点,你可通过和属性来自定义控制。

Actuator内置端点的返回JSON序列化统一使用ObjectMapper

在直线版本中,端点返回的序列化方式和MVC接口的并不一致,因此可能出现一些怪异现象。现在好了:所有端点的返回值序列化,统一使用来完成。

这个标准是通过:统一实现接口实现的。

Spring Boot 3.0.0正式发布,Banner不再支持图片&增强可观测性

其它升级/改版