本文已被https://yourbatman.cn收录;女娲Knife-Initializr工程可公开访问啦;程序员专用网盘https://wangpan.yourbatman.cn;技术专栏源代码大本营:https://github.com/yourbatman/tech-column-learning;公号后台回复“专栏列表”获取全部小而美的原创技术专栏
你好,我是YourBatman:一个俗人,贪财好色。
Title | Link |
---|---|
所属专栏 | [YourBatman]-资讯/新特性,[YourBatman]-Spring技术栈新特性 |
源代码 | https://github.com/yourbatman/FXP-java-ee |
程序员专用网盘公益上线啦,注册送1G超小容量,帮你实践做减法 | https://wangpan.yourbatman.cn |
Java开发软件包(Mac) | https://wangpan.yourbatman.cn/s/rEH0 提取码:javakit |
女娲工程 | http://152.136.106.14:8761 |
版本约定 | [Mac OS 13.0.1],[IDEA 2022.3] |
2014年发布Spring Boot 1.0;
2018年发布Spring Boot 2.0;
2022年发布Spring Boot 3.0;
这节奏,是要跟世界杯/奥运会的频率杠上呀?
PS:本届世界杯三颗巨星已走俩,期待Messi
北京时间2022-11-24,Spring Boot 3.0.0
正式发布。回忆一下上次发版还是上次,幸好笔者有记录:
Spring Boot 3.0.0是是首个支持Spring Framework 6以及支持GraalVM的版本。官方对各个版本支持时间表:
如果把2014年发布1.0版比作Spring团队的再次创业,发布后火爆程度可谓风靡全球。到2018年发布2.0版本,已经完全没有对手了。今年刚发布的3.0版本直接上Java 17以及Jakarta EE 9起步,可谓站稳脚跟后的引领风骚。
老规矩,将我们关心的功能爽一遍。
Spring Boot 3.0.0对外部依赖有最低版本要求:
据说,Spring Boot内部有专门一个“团队”来做应用的可观性,本次的借助Micrometer
的升级,使得可观测这件事在Spring Framework 6和Spring Boot 3.0.0内部都变得更加简单、易用!通过可观测性,能更好的了解系统内部的运行状态,做到胸有成竹。
Micrometer 1.10中引入的新的Observation API
,它使得一个API就能搞定:metrics、tracing、logging指标观测,并且还能传递上下文、传播元数据等等,对使用者非常友好。
这个API的设计是降低使用门槛,希望用户使用单一API,就能从中获取到多种信息:metrics、tracing、logging
笔者窥探了一下Spring Boot针对Micrometer源代码级别的变化,觉得值得用专题来做较为完整的表述,结合自己的一些使用经验,尽量去说清楚在项目中如何使用它来方便的观测你的Application。
一句话:配置性更灵活、和Spring环境整合得更好了。
PS:一般情况下使用默认的logback即可。倘若你不是典型的高并发场景,不建议折腾Log4j2
声明:这项特性更改和Spring Boot无关,属于Spring Framework 6的变更。
包含Spring MVC和WebFlux在内的URL 尾部斜杠 匹配方式,本次有调整:可参见PathMatchConfigurer
类
为了下掉trailingSlashMatch
这个属性,从Spring Framework 6开始将默认值由之前的true改为了fasle。虽然仅仅只是改了一个默认值,但这个变动其实还蛮大的,影响到了URL的匹配。
譬如,@GetMapping("/api/demo")
之前版本即可匹配/api/demo
亦可匹配上/api/demo/
,自Spring Boot 3.0.0(其实是Spring Framework 6)版本后就不行了,只能匹配上前者,后者404。Spring Framework目前将此属性只标记为了@Deprecated(since = "6.0")
过期,并未删除。因此若你从老项目里升级过来,那么请务必做好兼容,方式有两种:
@GetMapping({"/api/demo", "/api/demo/"})
@Configuration
public class YourWebConfiguration implements WebMvcConfigurer {
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
configurer.setUseTrailingSlashMatch(true);
}
}
在Spring Boot 2.7版本,引入了全新的INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
文件作为自动配置的文件,但那会依旧保留着对spring.factories
的支持。关于此项变更的具体详情可参考笔者这篇文章:Spring Boot 2.7.0正式发布,弃用OkHttp 3、弃用spring.factories机制
到了Spring Boot 3.0.0版本,删除掉了spring.factories
作为自动配置文件的支持。这个差异在AutoConfigurationImportSelector
文件里体现出来:
值得注意的是:只是删除了spring.factories
作为自动配置文件的支持,而不是不再支持这种SPI语法了。毕竟像什么EnvironmentPostProcessor
、AutoConfigurationImportFilter
、FailureAnalyzer
等加载实现类的方式用spring.factories
还是非常方便的。
Spring Boot此举,笔者觉得目的就想将自动配置文件的配置,和其它SPI配置分离(顺便做做简化),仅此而已
从源代码的角度看,改注解已经不能再被标注在类上了(编译不通过):
至于Spring Boot为何这么做?下面继续说完就懂了。
现在,当使用@ConfigurationProperties
注解进行属性绑定时,如果类只有1个构造器,则可以省略注解@ConstructorBinding
,不需要标注在构造器上。
PS:如果您有多个构造器,则仍然需要使用
@ConstructorBinding
来告诉 Spring Boot 使用哪一个
这样一句话描述体感还是不强,还是来个demo跑一跑。标注有@ConfigurationProperties
注解的属性类(一般有称作属性类,不叫配置类),如下:
注:如下例中,此时笔者并未在这个唯一构造器里标注
@ConstructorBinding
注解
/**
* 在此处添加备注信息
*
* @author YourBatman
* @since 0.0.1
*/
@ToString
@ConfigurationProperties("demo")
public class DemoProperties {
public DemoProperties(String name, Integer age) {
this.name = name;
this.age = age;
System.out.println("DemoConfiguration初始化成功:" + this);
}
private String name;
private Integer age;
}
配置文件里写好属性的k-v:
demo.name = YourBatman
demo.age = 18
通过@ConfigurationPropertiesScan
将@ConfigurationProperties
属性文件加载进容器:
/**
* 在此处添加备注信息
*
* @author YourBatman
* @since 0.0.1
*/
@ConfigurationPropertiesScan
@Configuration(proxyBeanMethods = false)
public class PropertiesConfiguration {
}
文件结构如下:
以上示例代码,在Spring Boot 2.7.x里运行结果为:报错
在Spring Boot 3.0.0版本运行结果为:正常
见识到了Spring Boot 3.0.0升级的威力。
令我,对于有多个构造器的case,笔者这里就不试了,建议有兴趣者自行动手跑跑Demo,加强理解比看文章100遍都强。
先说一个数据:据笔者所见所闻,至少**95%**程序员使用@ConfigurationProperties
的姿势是错的,并且不知道怎么做才是对的。
关于这个话题,在笔者之前有篇文章之前花大篇幅聊过,这里可再简单提一提,避免你在使用时候还出现些七七八八的问题。
比如上例中,如果我这么使用:如下截图,如果笔者没猜错的话,这大概率是你的使用方式吧
当然你可能不用构造器而是用get/set方法去处理,问题或许不会暴露出来,但不影响你继续往下看哈
在Spring Boot 2.7.x里运行结果为:报错
在Spring Boot 3.0.0版本运行结果为:报错
我在网上看到一篇写Spring Boot 3.0.0新特性的文章说到:改进的@ConstructorBinding检测能力
这项新特性部分支持,不建议使用!嗨,这个误导性就比较强了。
说白了不是Spring Boot 3.0.0部分支持,而是使用者对属性类Bean的使用姿势不对:这从Spring Boot 3.0.0的报错提示能看出端倪,明显比2.7.x版本的报错指向性更好,明确告诉了你原因依旧修复方式。
值得一提的是,如果编码时这么使用,连IntelliJ IDEA都不同意:非常明显的指出了问题所在:
PS:想要获取IDEA这样温暖的提示,需要升级到最新版2022.3版本哦。关于此版本的新特性,可移步笔者这篇文章:IntelliJ IDEA 2022.3正式发布,配置云同步&支持Redis好用到炸
在属性类Bean上标注@Configuration
注解(或者@Component
及其所有派生注解),是大多数程序员的错误使用方式。因为这里其实犯了几大错误:
@ConfigurationProperties
它并非一个Configuration配置类,因此不能直接走Spring Bean的初始化逻辑@ConfigurationProperties
类如果直接被实例化为Bean,将绕过了其特有的前置处理逻辑,造成逻辑缺失,也就会造成隐患bug@EnableConfigurationProperties
和@ConfigurationPropertiesScan
(since 2.2)注解来将@ConfigurationProperties
类正确的放入容器内倘若走捷径只需程序Run起来即可,那么这种问题积累多了,必将反噬。
如何发现最佳实践?对于Spring内部的组件,参考Spring Boot内置实现即可,它自己的东西自己的使用姿势就是绝对的权威。当然本质还是对实现原理的理解(但理解曲线比较长),有兴趣的可以看笔者之前的文章哈。
在KafkaProperties.Listener
属性配置类里,新增了asyncAcks
属性:
注意:此属性只在当KafkaProperties.Listener.ackMode = MANUAL/MANUAL_IMMEDIATE
的时候才生效。
异步ack可对应Kafka中间件的同步(sync)、异步(async)、oneway三种发送方式理解。
我们的Spring Boot应用入口是main方法,而@SpringBootTest
测试时它并没有执行我main方法,而是自己启的容器。这对于有些在main方法还写了些代码逻辑(比如设置个系统属性啥的)的时候就比较难受了。
这次在@SpringBootTest
注解上新增了一个属性:
它的含义为:
下面我们来体验一把:在main函数上输出一行日志
测试类:
运行测试类,日志为:
可以看到完完整整的执行了main方法(启动了应用),因此只要main方法能够执行到的代码、扫到的配置、加载到的Bean,都会被放入到测试上下文里。
2.7.x版本:启动日志包含主机名
3.0.0版本:启动日志不再包含主机名
代码差异体现在:
为何要干掉这段逻辑呢?看下这段代码的实现就知道了,还是比较耗时的:
这段逻辑干掉后,Spring Boot应用的启动速度应该会有比较明显的提升,收获比较大。
Java 17中,SecurityManager遭到弃用。同理,最低要求Java 17的Spring Boot 3.0.0也无理由再使用它了。
以Spring Boot的TomcatEmbeddedWebappClassLoader
类举例:上下对比可看出区别
先看看代码差异(上为2.7.x版本,下为3.0.0版本):
可以看到,Spring Boot 3.0.0直接干掉了ImageBanner
这个实现类。因此现在类路径下的banner.gif、banner.jpg、banner.png
等图片文件都将被忽略,反馈归真,只支持文本类Banner了!
PS:有兴趣的同学可以看看ImageBanner的实现,很高级且很复杂,当然也很耗时。看完就明白这个版本为啥要干掉它了~
从Spring Boot 2.7开始,web端点默认只暴露health,这次JMX也来跟着保持一致了。
如若需要显示控制其它端点,你可通过management.endpoints.jmx.exposure.include
和management.endpoints.jmx.exposure.exclude
属性来自定义控制。
在直线版本中,端点返回的序列化方式和MVC接口的并不一致,因此可能出现一些怪异现象。现在好了:所有端点的返回值序列化,统一使用ObjectMapper
来完成。
这个标准是通过:统一实现OperationResponseBody
接口实现的。
值得注意的事:若你有自定义的endpoint,那么也可通过实现OperationResponseBody
接口,来保持和内置端点序列化的一致性。
由于spring.data这个前缀保留给了Spring Data项目,因此之前Spring Boot上的有些配置需要做修改。
spring.data.cassandra.
-> spring.cassandra.
spring.redis.
-> spring.data.redis.
@AutoConfigureMetrics
-> @AutoConfigureObservability
@ConstructorBinding
注解迁移到org.springframework.boot.context.properties.bind
包了(之前版本在外层)
DiskSpaceHealthIndicator
详情里增加path的显示jakarta.validation.Configuration
现在可借助ValidationConfigurationCustomizer
定制化器进行定制了YamlJsonParser
类被删除。原因为:SnakeYAML的JSON解析与其它JSON库的解析行为不一致,为了避免用错而导致问题,干脆删除掉。推荐使用JsonParser
代替之基本上都是大版本号升级,毕竟命名空间从javax.* -> jakarta.*
这一步影响还是蛮大的。
Spring Boot管理上的为基于Jakarta EE 10(基线是Jakarta EE 9)
自从用上Spring Boot,程序员基本很少再需要关心三方依赖的版本号了,交给Spring Boot既省心又放心
早期程序员,应该有使用过spirng-bom的,深有体会。原来,Spring早就在筹划帮我们解决业务逻辑之外的痛点了
Spring Boot已然成为Java开发的基石,本次大版本升级,并且还是明确的阻断式的,因此可以看到大多建议都是清一色:正确的废话,所以笔者也来几句废话建议:
技术向前的大船,浩浩荡荡不可逆。作为技术人,我们能做的是keep moving,不管是技术架构师还是业务架构师,还是开发工程师!
我是YourBatman:前25年不会写Hallo World、早已毕业的大龄程序员。高中时期《梦幻西游》骨灰玩家,网瘾失足、清考、延期毕业、房产中介、保险销售、送外卖…是我不可抹灭的黑标签
- 2013.07 清考、毕业答辩3次未通过、延期毕业
- 2013.08-2014.07 宁夏中介公司卖二手房1年,毕业后第1份工作
- ️️2014.07-2015.05 荆州/武汉,泰康人寿卖保险3月、饿了么送外卖2月,还有炸鸡排、直销等第2345份工作
- 2015.08 开始从事Java开发,闯过外包,呆过大厂!擅长抽象思维,任基础架构团队负责人
- 2021.08 因“双减政策”失业!历经9面,终获美团外卖L8的offer
- ♀️Java架构师、Spring开源贡献者、CSDN博客之星年度Top 10、领域建模专家、写作大赛1/2届评委
- 高质量代码、规范践行者;DDD领域驱动深度实践;即将出版书籍
《Spring奇淫巧技》
序号 | 专栏名称 | 简介 |
---|---|---|
01 | [YourBatman]-程序人生 | 程序人生,人生程序 |
02 | [YourBatman]-资讯/新特性 | IDEA、JDK、Spring技术栈…新特性 |
03 | [YourBatman]-IntelliJ IDEA | 熟练使用IDEA就相当拥有物理外挂,助你高效编码 |
04 | [YourBatman]-Bean Validation | 熟练掌握数据校验,减少90%的垃圾代码 |
05 | [YourBatman]-日期时间 | 帮你解决JDK Date、JSR 310日期/其实 的一切问题 |
06 | [YourBatman]-Spring类型转换 | Spring类型转换-框架设计的基石 |
07 | [YourBatman]-Spring static | static关键字在Spring里的应用 |
08 | [YourBatman]-Cors跨域 | 关于跨域请求问题,本专栏足矣 |
09 | [YourBatman]-Jackson | Almost Maybe是最好的Jackson专栏 |
10 | [YourBatman]-Spring配置类 | 专讲@Configuration配置类,你懂的 |
11 | [YourBatman]-Spring技术栈 | 暂无所属小分类的,Spring技术栈大分类 |
12 | [YourBatman]-JDK | 暂无所属小分类的,JDK技术栈大分类 |
13 | [YourBatman]-Servlet | Servlet规范、Web相关内容专题 |
14 | [YourBatman]-Java EE | 从Java EE到Jakarta EE,30年弹指一挥间 |
15 | [YourBatman]-工具/提效 | 开发工具、软件工具,目标是提效 |
16 | [YourBatman]-Spring技术栈新特性 | Spring Framework、Spring Boot、Spring Cloud、Spring其它技术 |
17 | [YourBatman]-基本功 | 每个Javaer,都需要有扎实的基本功 |
… | … | … |
99 | 源代码库 | 大多数专栏均配有源代码,都在这里 |