SpringBoot2.x基础篇:配置文件的加载顺序以及优先级覆盖
2020/3/23 17:01:36
本文主要是介绍SpringBoot2.x基础篇:配置文件的加载顺序以及优先级覆盖,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
知识改变命运,撸码使我快乐,2020继续游走在开源界
点赞再看,养成习惯
给我来个Star吧,点击了解下基于SpringBoot的组件化接口服务落地解决方案
SpringBoot
约定了配置文件,默认为application.properties
,通过该文件可以修改很多默认的配置,当然我们还可以在该配置文件内添加自定义的配置,该文件通过key=value
的形式进行配置。
推荐阅读
疑惑配置提示?
当我们使用开发工具来配置时,就会出现相应的提示,这要完全要归功于spring-configuration-metadata.json
配置元数据文件,该文件内记录了配置的名称、类型、归属类等信息,如果配置类型为枚举
还可以实现选择性配置
。
SpringBoot
提供了一个依赖,它的主要任务就是自动生成配置元数据,该依赖的名称为spring-boot-configuration-processor
,在打包时会在META-INF
目录生成一个名为spring-configuration-metadata.json
的文件。
配置方式
虽然默认使用properties
格式的配置文件,不过这种方式会导致配置的部分前缀冗余,可阅读性稍差,SpringBoot
内部还支持使用yaml
方式的配置文件,只需要在src/main/resources
目录下创建一个名为application.yml
文件即可,使用配置时同样也有提供功能。
项目内可以同时存在application.properties
、application.yml
两个文件,经过测试发现,properties
优先级会高一些,相同名称的配置,会将yml
内的配置覆盖掉。
指定配置文件
如果你的应用程序配置文件的名称不是application
,你想要进行自定义,可以通过--spring.config.name
命令行参数进行指定,如下所示:
java -jar project-sample.jar --spring.config.name=custome 复制代码
**注意事项:**我们只需要指定配置文件的名称即可,可以使用
properties
或yaml
文件格式,上面的配置会加载src/main/resources/custome.yml
或src/main/resources/custome.properties
。
通过--spring.config.name
仅仅是修改了配置文件的名称,那如果是修改配置文件所处的目录位置,我们需要怎么做呢?
SpringBoot
已经给我们准备好了,通过--spring.config.location
参数就可以指定配置文件的位置,如下所示:
java -jar project-sample.jar --spring.config.location=classpath:/configs/custome.yml 复制代码
如果一个配置文件无法满足你的需求,那你看看下面这个方式:
java -jar project-sample.jar --spring.config.location=classpath:/configs/custome.yml,classpath:/configs/default.properties 复制代码
**注意事项:**支持通过命令行参数的方式指定多个配置文件,使用英文半角
,
隔开即可。
如果你通过spring.config.location
指定的不是一个文件而是一个目录,在路径最后务必添加一个"/"结束,然后结合spring.config.name
进行组合配置文件,组合示例如下:
# 加载/configs/application.properties 或 /configs/application.yml(默认文件名) java -jar project-sample.jar --spring.config.location=classpath:/configs/ # 加载/configs/custome.properties 或 /configs/custome.yml java -jar project-sample.jar --spring.config.location=classpath:/configs/ --spring.config.name=custome 复制代码
注意事项:
spring.config.name
该配置参数默认值为application
,所以如果只是指定了spring.config.location
并为目录形式,上面示例中会自动将spring.config.name
追加到目录路径后,如果指定的spring.config.location
并非是一个目录,这里会忽略spring.config.name
的值。
加载顺序
SpringBoot
应用程序在启动时会遵循下面的顺序进行加载配置文件:
- 类路径下的配置文件
- 类路径内config子目录的配置文件
- 当前项目根目录下的配置文件
- 当前项目根目录下config子目录的配置文件
示例项目配置文件存放结构如下所示:
. project-sample ├── config │ ├── application.yml (4) │ └── src/main/resources | │ ├── application.yml (1) | │ └── config | | │ ├── application.yml (2) ├── application.yml (3) 复制代码
启动时加载配置文件顺序:1 > 2 > 3 > 4
src/main/resources
下的配置文件在项目编译时,会放在target/classes
下。
优先级覆盖
SpringBoot
配置文件存在一个特性,优先级较高的配置加载顺序比较靠后,相同名称
的配置优先级较高
的会覆盖
掉优先级较低
的内容。
为了更好地解释这一点,我们根据对应的加载顺序分别创建一个application.yml
配置文件,来验证根据优先级的不同是否存在覆盖问题,如下图所示:
在上面四个配置文件中都有一个名为name
的配置,而红色字体标注的内容就是每个配置文件name
的配置内容,下面我们来启动项目测试下输出内容。
运行测试
在测试之前我们让启动类实现CommandLineRunner
接口,如下所示:
@SpringBootApplication public class LoadOrderOfConfigFilesApplication implements CommandLineRunner { public static void main(String[] args) { SpringApplication.run(LoadOrderOfConfigFilesApplication.class, args); } @Value("${name}") private String name; @Override public void run(String... args) throws Exception { System.out.println("配置名称:" + name); } } 复制代码
项目启动后通过run
方法进行打印${name}
配置的内容。
测试一:顺序覆盖
保留上面四个对应加载顺序的配置文件,启动项目,控制台输出内容:
配置名称:project/config 复制代码
期望与实际输出是符合的,项目根下的config
目录是最后加载
的,所以它的优先级
相对其他三个来说是最高
的,覆盖顺序为:4 > 3 > 2 > 1。
测试二:跨顺序覆盖
上一个测试点我们对每一个加载顺序都对应添加了一个配置文件,那如果我们只有两个project/config
、classes/config
两个目录的配置文件,是否按照优先级进行覆盖呢?
删除另外两个,只保留project/config
、classes/config
两个位置的配置文件,启动项目控制台输出如下所示:
配置名称:project/config 复制代码
同样是输出了优先级最高的project/config
配置文件的内容,覆盖顺序为:4 > 1
测试点:单顺序加载
平时在项目开发中一般都是将application.yml
配置文件放在src/main/resources
目录下,然而根据上面的加载顺序来看,我们可以将配置文件放置在任意一处,启动时都会进行加载。
仅保留classes/config
位置的配置文件,启动项目控制台输出内容如下所示:
配置名称:classes/config 复制代码
IDEA
对SpringBoot
的支持真的很强大, classes/config
下的配置文件同样提供了关键字提醒
功能。
总结
了解配置文件的加载顺序,才能得心应手的进行配置覆盖,完全控制在不同环境下使用不同的配置内容,要记住classes/application.yml
优先级最低,project/config/application.yml
优先级最高。
这篇关于SpringBoot2.x基础篇:配置文件的加载顺序以及优先级覆盖的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-26大厂数据结构与算法教程:入门级详解
- 2024-12-26大厂算法与数据结构教程:新手入门指南
- 2024-12-26Python编程入门指南
- 2024-12-26数据结构高级教程:新手入门及初级提升指南
- 2024-12-26并查集入门教程:从零开始学会并查集
- 2024-12-26大厂数据结构与算法入门指南
- 2024-12-26大厂算法与数据结构入门教程
- 2024-12-26二叉树入门教程:轻松掌握基础概念与操作
- 2024-12-26初学者指南:轻松掌握链表
- 2024-12-26平衡树入门教程:轻松理解与应用