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
- jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
- jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
再来加载不带profile的
- jar包外部的application.properties或application.yml(不带spring.profile)配置文件
- jar包内部的application.properties或application.yml(不带spring.profile)配置文件
例如:
将打好的jar包和application.properties文件放在同一文件夹下,如图所示:
其中jar包外部application.properties的配置内容为:
server.port=9080
jar包内部application.properties的配置内容为:
server.servlet.context-path=/demo
在命令行窗口运行java -jar spring-boot-profile-0.0.1-SNAPSHOT.jar
命令后,窗口打印:
说明加载了该配置文件,且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'
。