SpringBoot使用一个以application命名的配置文件作为默认的全局配置文件。支持properties后缀结尾的配置文件或者以yml/yaml后缀结尾的YAML的文件配置。
以设置应用端口为例:
properties文件示例(application.properties):
server.port=80
YAML文件示例(application.yml):
server:
port: 80
假如各配置文件都配置了不同的端口,那么SpringBoot会使用哪一个端口呢?带着疑问试验一下实例:
在resources目录下创建两个配置文件,一个为application.yml配置文件,设置端口为8010,另一个为application.properties配置文件,设置端口为8020;
运行结果:
结论:可见在同一目录下,yaml配置先加载 > properties配置后加载。所以我们在jar包启动时,properties的配置可以覆盖yml配置。
SpringBoot配置文件可以放置在多种路径下,不同路径下的配置加载优先级有所不同。
可放置目录(加载优先级从高到低),低优先级的配置会覆盖高优先级的配置;
- classpath:/ (类路径config下);
- classpath:/config/ (类路径config目录下);
- file:./ (当前项目路径下);
- file:./config/ (当前项目路径config目录下);
-
-
SpringBoot会从这四个位置全部加载配置文件并互补配置;
我们可以从ConfigFileApplicationListener这类便可看出,其中DEFAULT_SEARCH_LOCATIONS属性设置了加载的目录:
- @Deprecated
- public class ConfigFileApplicationListener implements EnvironmentPostProcessor, SmartApplicationListener, Ordered {
-
- // Note the order is from least to most specific (last one wins)
- private static final String DEFAULT_SEARCH_LOCATIONS = "classpath:/,classpath:/config/,file:./,file:./config/*/,file:./config/";
-
- private static final String DEFAULT_NAMES = "application";
- }
接着getSearchLocations方法中去逗号解析成Set,其中内部类Loader负责这一配置文件的加载过程,包括加载profile指定环境的配置,以application+’-’+name格式的拼接加载。
多种目录配置同时存在情况
接下来还是以端口配置为例
- 在resources/目录下配置文件设置端口为8888;
- 在resources/config目录下配置文件设置端口为9999;
- 在项目路径下配置文件设置端口为6666;
- 在项目路径config目录下配置文件设置端口为7777;
最终运行结果:
- Tomcat started on port(s): 7777 (http) with context path '/beedo'
- Started BeedoApplication in 4.544 seconds (JVM running for 5.335)
资源文件加载优先级结论:
优先级由高到低如下,低优先级的配置会覆盖高优先级的配置
- 1:resources/目录下配置文件;
- 2:在resources/config目录下配置文件;
- 3:在项目路径下配置文件;
- 4:在项目路径config目录下配置文件;