浅谈浅谈SpringBoot2.4 配置文件加载机制大变化配置文件加载机制大变化
主要介绍了浅谈SpringBoot2.4 配置文件加载机制大变化,文中通过示例代码介绍的非常详细,对大家的学习或
者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
前言前言
Spring Boot 2.4.0.M2刚刚发布,它对 application.properties 和 application.yml 文件的加载方式进行重构。如果应用程序仅使
用单个 application.properties 或 application.yml 作为配置文件,那么可能感受不到任何区别。但是如果您的应用程序使用更
复杂的配置(例如,Spring Cloud 配置中心等),则需要来了解更改的内容以及原因。
为什么要进行这些更改为什么要进行这些更改
随着最新版本 Spring Boot 发布,Spring 一直在努力提升对 Kubernetes 的原生支持。在 Spring Boot 2.3 中,官方增加
Kubernetes Volume 的配置支持,但是未能实现。
Volume 配置挂载是 Kubernetes 的一项常用功能,其中 ConfigMap 指令用于直接在文件系统上显示配置。您可以装载包含多
个键和值合并的完整 YAML 文件,也可以使用更简单的目录树格式,其中文件名是键,文件内容是值。
希望同时提供两者的支持,并且能够兼容我们现有的 application.properties 和 application.yml 。为此需要修改
ConfigFileApplicationListener 类。
ConfigFileApplicationListener 问题问题
在 Spring Boot 中配置文件加载类 ConfigFileApplicationListener 属于比较核心的底层代码,每次维护都是非常的困难。并不
是因为代码编写错误或者缺少相关单元测试,而是在添加新功能时,很难解决之前存在的问题。
即:
配置文件非常灵活,可以在当前文件启用其他配置文件。
文档加载顺序不固定。
以下面的例子来说:
security.user.password: usera
---
spring.profiles: local
security.user.password: userb
runlocal: true
---
spring.profiles: !dev
spring.profiles.include: local
security.user.password: userc
在这里,我们有一个 多文档 YAML文件(一个文件由三个逻辑文档组成,由 --- 分隔)。
如果使用 --spring.profile.actives=prod 运行,那么 security.user.password 的值是什么?是否设置 runlocal 属性?中间部分文
档是否包括在内,因为配置文件在处理时没有激活?
我们经常会遇到关于这个文件处理逻辑的问题,但是每当试图修复它们时,最后带来各种各样的负面问题。
因此,在 Spring boot 2.4 中对 Properties 和 YAML 文件的加载方式进行两个重大更改:
1. 文档将按定义的顺序加载。
2. profiles 激活开关不能被配置在特定环境中。
文档排序文档排序
从 Spring Boot 2.4 开始,加载 Properties 和 YAML 文件时候会遵循, 在文档中声明排序靠前的属性将被靠后的属性覆盖 。
这点与 .properties 的排序规则相同。我们可以想一想,每次将一个 Value 放入 Map ,具有相同 key 的新值放入时,将替换已
经存在的 Value。
同理对 Multi-document 的 YAML 文件,较低的排序也将被较高的覆盖:
test: "value"
---
test: "overridden-value"
Properties 文件支持多文档属性文件支持多文档属性
在 Spring Boot 2.4 中, Properties 支持类似 YAML 多文档功能。多文档属性文件使用注释( # )后跟三个(---)破折号来分
隔文档( 选择使用注释,以使现有的 IDE 正常支持 )。
评论0