springboot配置文件的加载先后顺序
1、内部配置加载顺序:
springboot启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件
- –file:./config/ --> jar包所在的目录的config目录下
- –file:./ --> jar包所在目录
- –classpath:/config/ --> jar包中的resources/config目录下
- –classpath:/ --> jar包中的resources目录下
SpringBoot官网:
优先级由高到底,高优先级的配置会覆盖低优先级的配置。
- 如果低优先级存在高优先级没有的属性,则会互补配置。
- 如果同一个配置属性,在多个配置文件都配置了,默认使用第1个读取到的
2、外部配置加载顺序:
SpringBoot也可以从以下位置加载配置; 优先级从高到低;高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置
(1)命令行参数 (加载时优先加载)
所有的配置都可以在命令行上进行指定( --配置
)。
可以通过指定 --spring.config.location来改变默认的配置文件位置:
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --spring.config.location=G:/application.yml
多个配置用空格分开;格式为: --配置项=值
(2)来自java:comp/env的JNDI属性
(3)Java系统属性(在命令行中使用-D
指定),可通过System.getProperties()获得相关内容
java -Dspring.application.json='{"my":{"name":"test"}}' -jar myapp.jar
(4)操作系统环境变量
- 大多数操作系统不允许使用句点分隔的键名,使用下划线代替(例如,SPRING_CONFIG_NAME代替spring.config.name)
(5)RandomValuePropertySource配置的random.*属性值
(6)jar包外部的application-{profile}.properties或application-{profile}.yml(带spring.profile)配置文件。
(7)jar包内部的application-{profile}.properties或application-{profile}.yml(带spring.profile)配置文件。
(8)jar包外部的application.properties或application.yml(不带spring.profile)配置文件。
(9)jar包内部的application.properties或application.yml(不带spring.profile)配置文件。
(10)@Configuration注解类上的@PropertySource
(11)通过SpringApplication.setDefaultProperties指定的默认属性
其中常用的为:(1)(6)(7)(8)(9)(10)
总结:
- 优先加载操作系统层面的配置、命令行
- 由jar包外向jar包内进行寻找,优先查找config目录。
- 优先加载带profile(application-{profile}.yml)的,后加载不带profile(application.yml)的
- 高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置
3、远程配置中心:
以Nacos为例:默认远程配置优先级最高
可以通过在远程配置中心中做如下配置,设置本地配置覆盖远程配置:
spring:
cloud:
config:
# 是否允许本地配置覆盖远程配置
allow-override: true
# 是否一切以本地配置为准,默认false
override-none: false
# 系统环境变量或系统属性才能覆盖远程配置文件的配置
# 本地配置文件中配置优先级低于远程配置,默认true
override-system-properties: true