Spring Boot项目启动时,会扫描以下位置的application.properties或者application.yml文件作为Spring Boot的默认配置文件。

  • file:./config/(根目录下的config目录)
  • file:./(根目录下)
  • classpath:./config/(类路径下的config目录)
  • classpath:./(类路径下的,即默认的配置文件)

以上是按照优先级从高到低的顺序加载,其中高优先级的配置会覆盖低优先级的配置
Spring Boot项目会从这四个位置加载全部的配置文件,从而进行互补配置。
例如:
根目录下的config目录下配置文件配置Tomcat的端口为9999,根目录下Tomcat的端口为9090,类路径下的config目录下Tomcat的端口为9080,类路径下的配置文件配置Tomcat的端口为8090。启动项目后,开放的端口为9999。这就是高优先级覆盖低优先级。
互补配置:
根目录下的config目录下配置文件配置Tomcat的端口为9999,在类路径下配置文件配置的项目访问路径为demo。

# 根目录下的config目录下的配置文件内容(最高优先级)
server:
  port: 9999
# 类路径下的配置文件内容(最低优先级)
server:
  servlet:
    context-path: /demo

启动项目后,控制台打印Tomcat started on port(s): 9999 (http) with context path '/demo',这说明,并不是高优先级的配置文件加载后,低优先级的就不会再加载,而是形成互补配置。
除此之外,我们还可以通过spring.config.location来改变默认的配置文件位置。
其中application.properties的配置内容为:

server.port=8888

使用java -jar spring-boot-profile-0.0.1-SNAPSHOT.jar --spring.config.location=D:/application.prope rties命令启动项目后,控制台打印Tomcat started on port(s): 8888 (http)。说明加载了指定的配置文件。

外部配置加载顺序:

SpringBoot也可以从以下位置加载配置:优先级按照从高到底。高优先级的配置会覆盖低优先级的配置,所有的配置会形成互补配置。

  • 命令行参数 java -jar spring-boot-config-0.0.1-SNAPSHOT.jar
    –server.port=8087 --server.context-path=/test 多个配置用空格分开。–配置项=值
  • 来自java:comp/env的JNDI属性
  • Java系统属性(System.getProperties())
  • 操作系统环境变量
  • *RandomValuePropertySource配置的random.属性值
    由jar包内向jar包外进行寻找:

优先加载带profile

  1. jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
  2. jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件

再来加载不带profile的

  1. jar包外部的application.properties或application.yml(不带spring.profile)配置文件
  2. jar包内部的application.properties或application.yml(不带spring.profile)配置文件

例如:
将打好的jar包和application.properties文件放在同一文件夹下,如图所示:

springboot文件地址win linux springboot配置文件的位置_配置文件加载位置


其中jar包外部application.properties的配置内容为:

server.port=9080

jar包内部application.properties的配置内容为:

server.servlet.context-path=/demo

在命令行窗口运行java -jar spring-boot-profile-0.0.1-SNAPSHOT.jar命令后,窗口打印:

springboot文件地址win linux springboot配置文件的位置_jar包_02


说明加载了该配置文件,且jar包内外的配置文件进行互补配置。

1. 通过@Configuration注解类上的@PropertySource
2. 通过SpringApplication.setDefaultProperties指定的默认属性

注意:
当同一个目录下同时存在application.properties和application,yml配置文件时,会优先加载properties文件里的内容,且两种文件会进行互补配置。Spring Boot项目启动时,会读取两个配置文件中的内容,然后加载不同的配置项,如果同一配置在两个配置文件中,均进行了配置,那么只会加载properties中的配置, 忽略yml中的配置。
例如:
Spring Boot的resource目录下,有application.properties和application.yml配置文件。其中application.properties中的配置内容如下:

server.port=8888

application.yml中的配置内容如下:

server:
  port: 9999
  servlet:
    context-path: /demo

那么最终配置为端口号是8888,项目路径为/demo。Tomcat started on port(s): 8888 (http) with context path '/demo'