一.Spring Boot 核心配置文件详解
用过 Spring Boot 的都知道在 Spring Boot 中有以下两种配置文件
bootstrap (.yml 或者 .properties)
application (.yml 或者 .properties)
为什么会有这两种配置文件呢?大家都清楚它们的区别和具体使用场景吗?
翻了Spring Boot官方文档 大致内容如下:
Spring Cloud 构建于 Spring Boot 之上,在 Spring Boot 中有两种上下文,
一种是 bootstrap, 另外一种是 application, bootstrap 是应用程序的父上下文,
也就是说 bootstrap 加载优先于 applicaton。bootstrap 主要用于从额外的资源来
加载配置信息,还可以在本地外部配置文件中解密属性。这两个上下文共用一个环境,
它是任何Spring应用程序的外部属性的来源。bootstrap 里面的属性会优先加载,
它们默认也不能被本地相同配置覆盖。
因此,对比 application 配置文件,bootstrap 配置文件具有以下几个特性。
boostrap 由父 ApplicationContext 加载,比 applicaton 优先加载
boostrap 里面的属性不能被覆盖
bootstrap/ application 的应用场景
application 配置文件这个容易理解,主要用于 Spring Boot 项目的自动化配置。
bootstrap 配置文件有以下几个应用场景。
- 使用 Spring Cloud Config 配置中心时,这时需要在 bootstrap 配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息;
- 一些固定的不能被覆盖的属性
- 一些加密/解密的场景;
二.Spring Boot 配置文件优先级问题
1. 当配置文件同时存在 .yml/yaml 和 .properties的配置文件那个生效?
结论:可见在同一目录下,properties配置优先级 > YAML配置优先级。//所以我们在jar包启动时带上properties写法的配置可以覆盖配置
2. 配置文件目录
SpringBoot配置文件可以放置在多种路径下,不同路径下的配置优先级有所不同。
可放置目录(优先级从高到低)
1.file:./config/ (当前项目路径config目录下);
2.file:./ (当前项目路径下);
3.classpath:/config/ (类路径config目录下);
4.classpath:/ (类路径config下).
优先级由高到底,高优先级的配置会覆盖低优先级的配置;
SpringBoot会从这四个位置全部加载配置文件并互补配置;
我们可以从ConfigFileApplicationListener这类便可看出,其中DEFAULT_SEARCH_LOCATIONS属性设置了加载的目录:
private static final String DEFAULT_SEARCH_LOCATIONS
= "classpath:/,classpath:/config/,file:./,file:./config/";
接着getSearchLocations方法中去逗号解析成Set,其中内部类Loader负责这一配置文件的加载过程,包括加载profile指定环境的配置,以application+’-’+name格式的拼接加载。
注意:maven打包是不能把src外面的两个application.properties文件打到jar包里的。
3. 多种目录配置同时存在情况
在项目中配置端口不同,看任务启动最终是哪个配置文件生效
以端口配置为例
1.在resources/目录下配置文件设置端口为8888;
2.在resources/config目录下配置文件设置端口为9999;
3.在项目路径下配置文件设置端口为6666;
4.在项目路径config目录下配置文件设置端口为7777;
最终运行结果:
Tomcat started on port(s): 7777 (http) with context path '/beedo'
Started BeedoApplication in 4.544 seconds (JVM running for 5.335)
通过控制变量法得以论证
其优先级由高到底,高优先级的配置会覆盖低优先级的配置
参考 :
https://blog.csdn.net/it_faquir/article/details/80869578
https://blog.csdn.net/zzhongcy/article/details/107200796?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_baidulandingword-2&spm=1001.2101.3001.4242