Springboot 配置文件加载顺序是怎么样的?

Sringboot 配置文件三连

Springboot 中我们通常用的配置文件有两种形式:yml和properties

那么当同时存在yml和properties文件时,加载顺序是怎么样的呢?

因此yml和properties加载顺序来说的话,是先读取的yml的配置再读取properties的配置。

如果yml和properties里面配置了相同的属性的话,那么使用的是哪一个文件的配置呢?

我们搭建一个Springboot应用,然后同时配置上application.yml和application.properties两个文件

#application.yml配置
server:
  port: 7070
#application.properties配置
  server.port=9090

启动后发现端口是9090这个端口,那么此时使用的是properties文件的配置,这时候我有下面两种猜想:
一、启动时先读到了7070,再读到9090这个端口,然后决定使用后者(后面读的配置优先级高)。
二、启动时先读到了9090,然后就启用,后面读到相同属性的配置不进行更改。

根据网上搜索的结果:是第一种情况,后面读取的配置优先级会更高,所以最终使用的是properties文件里面的属性。因此yml和properties加载顺序来说的话,是先读取的yml的配置再读取properties的配置。

(待补充源码跟踪……)
Springboot 配置文件加载顺序是怎么样的?_第1张图片

拓展一下
当application.properties和application-dev.properties有相同配置时

#application.properties配置
  server.port=9090
  spring.profiles.active=dev
#application-dev.properties配置
  server.port=8081

此时启动tomcat的时候端口是8081(也就是使用了dev的配置)

Springboot官方给出的文档如下:

1、开发者工具 Devtools 全局配置参数;
2、单元测试上的 @TestPropertySource 注解指定的参数;
3、单元测试上的 @SpringBootTest 注解指定的参数;
4、命令行指定的参数,如 java -jar springboot.jar --name="Java技术栈";
5、命令行中的 SPRING_APPLICATION_JSONJSON 指定参数, 如 java -Dspring.application.json='{"name":"Java技术栈"}' -jar springboot.jar
6、ServletConfig 初始化参数;
7、ServletContext 初始化参数;
8、JNDI参数(如 java:comp/env/spring.application.json);
9、Java系统参数(来源:System.getProperties());
10、操作系统环境变量参数;
11、RandomValuePropertySource 随机数,仅匹配:ramdom.*;
12、JAR包外面的配置文件参数(application-{profile}.properties(YAML))
13、JAR包里面的配置文件参数(application-{profile}.properties(YAML))
14、JAR包外面的配置文件参数(application.properties(YAML))
15、JAR包里面的配置文件参数(application.properties(YAML))
16、@Configuration配置文件上 @PropertySource 注解加载的参数;
17、默认参数(通过 SpringApplication.setDefaultProperties 指定);

作者:niaonao
链接:https://juejin.im/post/5d22e80a6fb9a07ec63b3839
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

其中第四条:当我们使用 java -jar bootdemo-0.0.1-SNAPSHOT.jar --server.port=6060的时候,启动的端口号就是我们启动参数指定的6060

你可能感兴趣的:(Springboot)