SpringBoot配置文件的加载优先级

446 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情

今天,朋友问我关于application.propertiesapplication.yml核心配置文件的优先级问题,他告诉我学习视频里面说的是application.yml优先级高,我当时就说不对,application.properties的优先级高,其实我的回答是不对的,需要从两个方面考虑这个问题,文件的优先级和文件夹的优先级,从而有了下面的测试用例。

  1. properties vs yml
    - resources
        - application.properties # 8081
        - application.yml        # 8082
    

通过简单的启动试验发现 properties > yml

  1. classpath: vs classpath:/config
    - /resources/application.properties         # 8081
    - /config/application.properties            # 8082
    

启动发现 classpath:/config > classpath

小结:发现properties的优先级大于yml,config的优先级大于classpath

  1. classpath:/config/yml vs classpath:properties
    - /application.properties  # 8081
    - /config/application.yml # 8082
    

启动发现 classpath:/config/yml > classpath:properties

通过这个试验可以发现,位置的优先级大于命名的优先级

  1. 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

  1. 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

  1. classpath:/config/properties vs classpath:application-default.yml 通过前面的实验发现config的优先级还是蛮高的,但是与default相比谁高呢?
    - /resources/application-default.yml         # 8081
    - /config/application.properties             # 8082
    

启动发现,application-default.yml > /config/application.propertiesdefault的优先级是大于config目录的

  1. 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)

image-20220505210311-0gkpnzl

以上是按照优先级从高到低(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

项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置。指定配置文件和默认加载的这些配置文件共同起作用形成互补配置。