SpringBoot中的配置文件加载优先级详解
作者:my_sky_
springboot配置文件的加载先后顺序
1、内部配置加载顺序
springboot启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件
- –file:./config/ --> 当前项目根目录下的 config 目录下
- –file:./ --> 当前项目的根目录下
- –classpath:/config/ --> resources/config目录下
- –classpath:/ --> resources目录下
SpringBoot官网:
优先级由高到底,高优先级的配置会覆盖低优先级的配置。
- 如果低优先级存在高优先级没有的属性,则会互补配置。
- 如果同一个配置属性,在多个配置文件都配置了,默认使用第1个读取到的
这四个位置是默认位置,即 Spring Boot 启动,默认会从这四个位置按顺序去查找相关属性并加载。
我们也可以通过 spring.config.location 属性来手动的指定配置文件位置,指定完成后,系统就会自动去指定目录下查找 application.properties 文件。
java -jar properties-0.0.1-SNAPSHOT.jar --spring.config.location=classpath:/javaboy/
项目默认加载的配置文件名是 application ,我们可以通过属性 spring.config.name 来指定配置文件的文件名。
使用 spring.config.location 属性重新定义配置文件的位置,它会覆盖掉默认的四个位置。使用 spring.config.additional-location 这个属性自定义配置文件位置,表示在默认的四个位置的基础上,再添加几个位置,新添加的位置的优先级大于原本的位置。 在自定义配置文件位置时,值一定要以 / 结尾。例如 spring.config.location=classpath:/myconfig/
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
到此这篇关于SpringBoot中的配置文件加载优先级详解的文章就介绍到这了,更多相关SpringBoot配置文件优先级内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!