Spring Boot 2.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 文件的加载方式进行两个重大更改:
- 文档将按定义的顺序加载。
- 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 正常支持 )。
例如,上面的 YAML 等效的 properties 为:
test=value
#---
test=overridden-value
特定环境激活配置
上述示例实际上没有任何意义,在我们开发过程中更为常见是声明某个属性仅在特定环境生效激活。
在 Spring Boot 2.3 中可以配置 spring.profiles
来实现。但在 Spring Boot 2.4 中 属性更改 为 spring.config.activate.on-profile
。
例如,我们想要 test
属性仅仅在 dev
Profile 激活时覆盖它,则可以使用以下配置:
test=value
#---
spring.config.activate.on-profile=dev
test=overridden-value
Profile Activation
使用 spring.profiles.active
属性在 application.properties
或 application.yaml
文件的 根配置文件 来激 相关环境文件。
例如,下面这样:
test=value
spring.profiles.active=local
#---
spring.config.activate.on-profile=dev
test=overridden value
不允许的是将 spring.profiles.active
属性与 spring.config.activate.on-profile
一起使用。例如,以下文件将引发异常:
test=value
#---
spring.config.activate.on-profile=dev
spring.profiles.active=local # will fail
test=overridden value
通过这一新限制能使 application.properties
和 application.yml
文件更加容易理解。使得 Spring Boot 本身更易于管理和维护。
Profile Groups
Profile Groups 是 Spring Boot 2.4 中的一项新功能,可让您将单个配置文件扩展为多个子配置文件。例如,假设有一组复杂的 @Configuration
类,可以使用 @Profile
注释有条件地启用它们。使用 @Profile("proddb")
开启数据库配置,使用 @Profile("prodmq")
开启消息配置等等。
使用多个配置文件可以使我们的代码更易于理解,但是对于部署而言并不是理想的选择。若用户需要同时激活 proddb
, prodmq
, prodmetrics
等。那么 Profile Groups 可让您做到这一点。
您可以在 application.properties
或 application.yml
文件中定义 spring.profiles.group,那么开启 prod 则就相当于激活了此组的全部环境
。例如:
spring.profiles.group.prod=proddb,prodmq,prodmetrics
Importing 扩展 Configuration
现在,我们已经解决了配置文件处理的基本问题,我们终于能够考虑我们想要提供的新功能。我们使用 Spring Boot 2.4 提供的主要功能是支持导入其他配置。
对于早期版本的 Spring Boot,很难在 application.properties
和 application.yml
之外导入其他 properties
或 yaml
文件。可以使用 spring.config.additional-location
属性但它可以处理的文件类型非常有限。
在 Spring Boot 2.4 可以直接在 application.properties
或 application.yml
文件中使用新的 spring.config.import
属性。例如希望导入一个 "忽略的 git" 的 developer.properties
文件,以便团队中的任何开发人员都可以快速更改属性:
application.name=myapp
spring.config.import=developer.properties
甚至可以将 spring.config.import
与 spring.config.activate.on-profile
结合起来使用。例如,这里 prod.properties
仅在 prod
配置文件处于激活状态时加载:
spring.config.activate.on-profile=prod
spring.config.import=prod.properties
Import 可以被视为在声明它们的文档下方插入的其他文档。它们 遵循与常规多文档文件相同的自上而下的顺序:导入仅被导入一次,无论声明了多少次。
volume 挂载配置
导入定义使用与 URL 一样语法作为其值。如果您的位置没有前缀,则它被视为常规文件或文件夹。但是,如果您使用 configtree:
前缀,则告诉 Spring Boot,您将期望在该位置使用 Kubernetes volume 装载的配置树。
例如,您可以在 application.properties
配置:
spring.config.import=configtree:/etc/config
如果您有以下装载的内容:
etc/
+- config/
+- my/
| +- application
+- test
将在 Spring Environment
中拥有 my.application
和 test
属性。 my.application
的值是 /etc/config/my/application
的内容, test
的值是 /etc/config/test
的内容。
根据云平台类型激活
如果只希望 Volume 挂载的配置(或该内容的任何属性)在特 定的云平台上 处于激活状态,可以使用 spring.config.activate.on-cloud-platform
属性。它的工作方式与 spring.config.activate.on-profile
类似,但它使用 CloudPlatform
的值,而不是配置文件名称。
如果我们想要在部署到 Kubernetes 时启用上述配置树,我们可以执行以下操作:
spring.config.activate.on-cloud-platform=kubernetes
spring.config.import=configtree:/etc/config
支持其他位置
spring.config.import
属性中指定的位置字符串是完全可插拔的,可以通过编写几个自定义类来扩展,第三方库将对自定义位置提供支持。例如,你能想到的第三方 jar 文件,例如 archaius://…
, vault://…
或 zookeeper://…
。
如果您有兴趣添加其他位置支持,请查看 org.springframework.boot.context.config
包 ConfigDataLocationResolver
和 ConfigDataLoader
的 javadoc。
版本回滚
正如上文所描述的,Spring Boot 针对配置文件的功能变更是非常大的。考虑到低版本的兼容性
可以设置 spring.config.use-legacy-processing=true
属性即可,恢复到之前版本的文件处理机制。
如果发现关于此处的问题,则需要切换到旧版处理,请 在 GitHub 上提出问题,官方将尝试解决该问题。
总结
官方希望新的配置数据处理更加好用,并且不会引起太多升级麻烦。如果您想了解更多有关它们的信息,可以查阅更新的 参考文档。
欢迎关注我,后续会通过代码来详细说明此处变更。
翻译: 冷冷、如梦技术
原文链接:https://spring.io/blog/2020/08/14/config-file-processing-in-spring-boot-2-4
Spring Boot 2.4 配置文件将加载机制大变化的更多相关文章
- 在Spring Boot中从类路径加载文件
介绍 创建Spring Boot Web应用程序时,有时有时需要从类路径中加载文件:war和jar的加载文件格式是不一样的 在下面,您将找到在WAR和JAR中加载文件的解决方案. 资源加载器 使用Ja ...
- 精尽Spring Boot源码分析 - 配置加载
该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...
- Spring源码解析-配置文件的加载
spring是一个很有名的java开源框架,作为一名javaer还是有必要了解spring的设计原理和机制,beans.core.context作为spring的三个核心组件.而三个组件中最重要的就是 ...
- Spring Boot 启动以后然后再加载缓存数据 CommandLineRunner
实际应用中,我们会有在项目服务启动完成以后去加载一些数据或做一些事情(比如缓存)这样的需求. 为了解决这样的问题,Spring Boot 为我们提供了一个方法,通过实现接口 CommandLineRu ...
- spring 配置参数从配置文件中加载到PropertiesFactoryBean 和配置参数从数据库加载到PropertiesFactoryBean 的实现,及项目中的相关应用
1.加载.properties文件中的配置参数加载到PropertiesFactoryBean容器中 <bean id="configProperties" class=&q ...
- hadoop配置文件的加载机制
hadoop通过Configuration类来保存配置信息 1.通过Configuration.addResource()来加载配置文件 2.通过Configuration.get***()来获取配置 ...
- hadoop配置文件的加载机制 分类: A1_HADOOP 2015-01-21 11:29 839人阅读 评论(0) 收藏
hadoop通过Configuration类来保存配置信息 1.通过Configuration.addResource()来加载配置文件 2.通过Configuration.get***()来获取配置 ...
- (转)spring boot实战(第六篇)加载application资源文件源码分析
原文:http://blog.csdn.net/liaokailin/article/details/48878447
- Spring Boot 2.4.0正式发布,全新的配置文件加载机制(不向下兼容)
千里之行,始于足下.关注公众号[BAT的乌托邦],有Spring技术栈.MyBatis.JVM.中间件等小而美的原创专栏供以免费学习.分享.成长,拒绝浅尝辄止.本文已被 https://www.you ...
随机推荐
- Baccarat项目专用代币BGV的价值如何?
NGK投资者对于NGK平台自身的DeFi项目呼声越来越高,经过数月的紧张研发,检验和内测工作,NGK官方将于近日推出其去中心化金融项目--Baccarat,此项目为避免以太坊易被攻击,网络拥堵出块慢以 ...
- 「NGK每日快讯」12.14日NGK公链第41期官方快讯!
- Python数据结构与算法_最长公共前缀(05)
编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow" ...
- 面试必知:String、StringBuilder、StringBuffer的区别
你知道String.StringBuilder.Stringbuffer的区别吗?当你创建字符串的时候,有考虑过该使用哪个吗? 别急,这篇文章带你解决这些问题. 可变性 首先,String是字符串,我 ...
- 使用PowerDesigner进行数据库设计并直接把设计好的表导出相应的建表语句
Power Designer:数据库表设计工具 PowerDesigner是Sybase公司的一款软件,使用它可以方便地对系统进行分析设计,他几乎包括了数据库模型设计的全过程.利用PowerDesig ...
- Linux系统管理--part(1)
Linux系统管理--part(1) Linux系统安装完毕,需要对Linux系统进行管理和维护,让Linux服务器能够真正英语于企业中 Linux运维的三个步骤安装.调试.启动 通过本篇文章,将学习 ...
- Hi3559AV100外接UVC/MJPEG相机实时采图设计(一):Linux USB摄像头驱动分析
下面将给出Hi3559AV100外接UVC/MJPEG相机实时采图设计的整体流程,主要实现是通过V4L2接口将UVC/MJPEG相机采集的数据送入至MPP平台,经过VDEC.VPSS.VO最后通过HD ...
- 【图像处理】使用OpenCV+Python进行图像处理入门教程(二)
这篇随笔介绍使用OpenCV进行图像处理的第二章 图像的运算,让我们踏上继续回顾OpenCV进行图像处理的奇妙之旅,不断地总结.回顾,以新的视角快速融入计算机视觉的奥秘世界. 2 图像的运算 复杂的 ...
- JQGrid 应用
jqGrid 原理 jqGrid是典型的B/S架构,服务器端只是提供数据管理,客户端只提供数据显示.换句话说,jqGrid可以以一种更加简单的方式来展现你数据库的信息,而且也可以把客户端数据传回给服务 ...
- iot漏洞mips汇编基础
1 基础概念 MIPS(Microprocessor without Interlocked Piped Stages architecture),是一种采取精简指令集(RISC)的处理架构,由MIP ...