• SpringBoot配置加载优先级


    1.SpringBoot配置文件


    SpringBoot使用一个以application命名的配置文件作为默认的全局配置文件。支持properties后缀结尾的配置文件或者以yml/yaml后缀结尾的YAML的文件配置。

    以设置应用端口为例:

    properties文件示例(application.properties):

    server.port=80


    YAML文件示例(application.yml):

    server:
      port: 80


    2.两者同时存在情况


    假如各配置文件都配置了不同的端口,那么SpringBoot会使用哪一个端口呢?带着疑问试验一下实例:

    在resources目录下创建两个配置文件,一个为application.yml配置文件,设置端口为8010,另一个为application.properties配置文件,设置端口为8020;
    运行结果:


    结论:可见在同一目录下,yaml配置先加载 > properties配置后加载。所以我们在jar包启动时,properties的配置可以覆盖yml配置。

    2.配置文件目录及加载顺序


    SpringBoot配置文件可以放置在多种路径下,不同路径下的配置加载优先级有所不同。
    可放置目录(加载优先级从高到低),低优先级的配置会覆盖高优先级的配置;

    1. classpath:/ (类路径config下);
    2. classpath:/config/ (类路径config目录下);
    3. file:./ (当前项目路径下);
    4. file:./config/ (当前项目路径config目录下);


    SpringBoot会从这四个位置全部加载配置文件并互补配置;
    我们可以从ConfigFileApplicationListener这类便可看出,其中DEFAULT_SEARCH_LOCATIONS属性设置了加载的目录:

    1. @Deprecated
    2. public class ConfigFileApplicationListener implements EnvironmentPostProcessor, SmartApplicationListener, Ordered {
    3. // Note the order is from least to most specific (last one wins)
    4. private static final String DEFAULT_SEARCH_LOCATIONS = "classpath:/,classpath:/config/,file:./,file:./config/*/,file:./config/";
    5. private static final String DEFAULT_NAMES = "application";
    6. }


    接着getSearchLocations方法中去逗号解析成Set,其中内部类Loader负责这一配置文件的加载过程,包括加载profile指定环境的配置,以application+’-’+name格式的拼接加载。

    多种目录配置同时存在情况
    接下来还是以端口配置为例

    1. 在resources/目录下配置文件设置端口为8888;
    2. 在resources/config目录下配置文件设置端口为9999;
    3. 在项目路径下配置文件设置端口为6666;
    4. 在项目路径config目录下配置文件设置端口为7777;


     最终运行结果:

    1. Tomcat started on port(s): 7777 (http) with context path '/beedo'
    2. Started BeedoApplication in 4.544 seconds (JVM running for 5.335)


    资源文件加载优先级结论:
    优先级由高到低如下,低优先级的配置会覆盖高优先级的配置
     

    1. 1:resources/目录下配置文件;
    2. 2:在resources/config目录下配置文件;
    3. 3:在项目路径下配置文件;
    4. 4:在项目路径config目录下配置文件;


     

  • 相关阅读:
    2022年是SEO行业凋谢的一年
    golang面试题:reflect(反射包)如何获取字段tag​?为什么json包不能导出私有变量的tag?
    会计学原理名词解释和简答
    Navicat运行sql文件导入数据不全或导入失败
    每日三题 6.30(2)
    数学建模笔记(一)数学建模一般步骤
    测试平台项目部署二(手动部署改成Dockerfile)
    CIO40--数字化转型之回报效益ROI(含表格)
    【Node.js】时钟案例---将一个网页分别拆分成css、html和js文件
    嵌入式STM32 单片机 GPIO 的工作原理详解
  • 原文地址:https://blog.csdn.net/weixin_39519454/article/details/133087072