Spring Boot启动会扫描以下位置的application.properties或者application.yml文件作为Spring Boot的默认配置文件
外部配置的加载顺序官网 说明
SpringApplication
loads properties from application.properties
files in the following locations and adds them to the Spring Environment
:
-
A
/config
subdirectory of the current directory -
The current directory
-
A classpath
/config
package -
The classpath root
The list is ordered by precedence (properties defined in locations higher in the list override those defined in lower locations).
读取位置就是:
- file:/config/
- file:/
- classpath:/config/
- classpath:/
以上顺序按照优先级从高到低的顺序,所有位置的文件都会被加载,高优先级的配置内容会覆盖低优先级配置的内容,其中配置文件中的内容是互补配置,即
存在相同的配置内容,高优先级的内容会覆盖低优先级的内容存在不同的内容的时候,高优先级和低优先级的配置内容取并集我们也可以通过spring.config.location来改变默认的配置,具体做法就是项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置,指定配置文件和默认加载的配置文件共同起作用称为互补配置
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --spring.config.location=D:/application.properties
外部配置的加载顺序
命令行参数命令行参数的优先级是最高的,假定内部配置的最高优先级配置文件配置的启动端口号是8081,启动命令行参数如以下设置:
java -jar spring-boot-02-config-02.0.0.1-SNAPSHOT.jar --server.port=8089
那么启动的端口就改成了8089,命令行可以把项目的所有的配置选项全部都改掉
Spring Boot也可以从以下位置加载配置: 优先级从高到低顺序,高优先级覆盖低优先级,如有不同内容,高优先级和低优先级形成互补配置
- 来自java:comp/env的JNDI属性
- java系统属性(System.getProperties())
- 操作系统环境变量
- RandomValuePropertySource配置的random.*属性值
- jar包外部的application-{profile}.properties或者application.yml(带spring.profile)配置文件
- jar包内部的application-{profile}.properties或者application.yml(带spring.profile)配置文件
- jar包外部的application.properties或者application.yml(不带spring.profile)配置文件
- jar包内部的application.properties或者application.yml(不带spring.profile)配置文件
- @Configuration注解类上的@PropertySource
- 通过SpringApplication.setDefaultProperties指定的默认属性
其它
搭建springcloud项目,抽出了个公共的common模块,其他服务依赖于common模块。
我搭springboot项目一般习惯分application.yml
、application-dev.yml
、application-prod.yml
三个配置文件,application.yml
为主配置文件,通过spring.profiles.active
属性指定其他配置文件,开发时指定为dev
环境,线上指定为prod
,方便切换。
问题
由于我将数据库信息配置在了common模块,同样的建立了这三个配置文件。现在需要开发用户user模块,引入了common模块,发现不会读取common模块的这三个配置文件,连不上数据库。
原因
springboot如果自己有application.yml
,就会覆盖依赖模块的同名配置文件。spring.profiles.active
也是,先到自身resource目录下找,如果找不到再去依赖模块找。
例如我在user模块建了application.yml
,common模块的application.yml
就不会读取。
在user模块application.yml
配置了spring.profiles.active: dev
,但因为user模块本身也有application-dev.yml
这个文件,所以不会再去读取common的application-dev.yml
配置。
方法1
将common模块的配置文件名称改掉,例如改成application-common.yml
,然后在user模块用spring.profiles.active: dev,common
同时引入。
因为user模块没有application-common.yml
,就会去common模块找。
缺点:这种方法如果不小心起重名了,则会整个覆盖,而不是作为补充。并且在切换线上线下环境时也不方便。
方法2
在common模块的resource文件夹下创建个config
文件夹,把配置文件移入。官方文档也是推荐这种方法。
这种方法若user模块和common模块的配置文件同时存在,会优先用user模块的配置,common模块的配置会作为补充