持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情
今天,朋友问我关于application.properties和application.yml核心配置文件的优先级问题,他告诉我学习视频里面说的是application.yml优先级高,我当时就说不对,application.properties的优先级高,其实我的回答是不对的,需要从两个方面考虑这个问题,文件的优先级和文件夹的优先级,从而有了下面的测试用例。
- properties vs yml
- resources - application.properties # 8081 - application.yml # 8082
通过简单的启动试验发现 properties > yml
- classpath: vs classpath:/config
- /resources/application.properties # 8081 - /config/application.properties # 8082
启动发现 classpath:/config > classpath
小结:发现properties的优先级大于yml,config的优先级大于classpath
- classpath:/config/yml vs classpath:properties
- /application.properties # 8081 - /config/application.yml # 8082
启动发现 classpath:/config/yml > classpath:properties
通过这个试验可以发现,
位置的优先级大于命名的优先级
- properties vs -profile.properties
application.properties 与 application-{profile}.properties 默认的profile为default
那么就先对比application.properties 与 applicaation-default.properties 的优先级
- resources - application.properties # 8081 - application-default.properties # 8082
启动发现:application-default.properties > application.properties
- properties vs -profile.yml
将
application-default.properties替换为application-default.yml- resources - application.properties # 8081 - application-default.yml # 8082
启动发现,application-default.yml > application.properties
所以,加上-default的profile属性时,yml将会大于不加profile的properties,当然如果同时加上profile的属性,那么properties依然会大于yml
- classpath:/config/properties vs classpath:application-default.yml
通过前面的实验发现config的优先级还是蛮高的,但是与
default相比谁高呢?- /resources/application-default.yml # 8081 - /config/application.properties # 8082
启动发现,application-default.yml > /config/application.properties,default的优先级是大于config目录的
- classpath:/config/application-default.yml vs classpath:/application-default.yml
- /resources/application-default.yml # 8081 - /config/application-default.yml # 8082
启动发现,同样是default的条件下,config/application-default.yml > application-default.yml
- 个人总结
config/application-default.properties > config/application-default.yml > application-default.properties > application-default.yml > config/application.properties > config/application.yml > application.properties > application.yml
再说两句,哈哈!
pring boot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件
–file:./config/ (1)
–file:./ (2)
–classpath:/config/ (3)
–classpath:/ (4)
以上是按照优先级从高到低(1-4)的顺序,所有位置的文件都会被加载, 高优先级配置内容会覆盖低优先级配置内容
高优先级配置内容会覆盖低优先级配置内容
高优先级配置内容会覆盖低优先级配置内容
个人一般情况下就配置3或者4的位置
SpringBoot会从这四个位置全部加载主配置文件,如果高优先级中配置文件属性与低优先级配置文件不冲突的属性,则会共同存在—互补配置。
我不会无聊的改变默认位置,如果你需要可以通过配置spring.config.location来改变默认配置。
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --spring.config.location=D:/application.properties
项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置。指定配置文件和默认加载的这些配置文件共同起作用形成互补配置。