SpringBoot 简明教程之项目属性配置(三):配置文件优先级及多配置切换
SpringBoot 简明教程之项目属性配置(三):配置优先级及多环境切换
在实际的项目开发中,一个项目从开发到上线的过程中会有多个配置环境,比如:
开发环境 -> 测试环境 -> 生产环境
所以,如果我们忘记修改了,那就是个伤脑经的问题。幸好,Spring Boot依靠其优先级配置读取的机制来帮助我们从这种困境中走出来。
配置文件优先级
位置优先级
Springboot 启动会扫描以下位置的application.yml文件作为Spring boot的默认配置文件
–file:./config/
–file:./
–classpath:/config/
–classpath:/
例如:
首先,我们在【classpath:/】路径下将端口配置为:8080,我们启动Spring Boot项目:
此时,启动的端口是:8080.
接着,我们再在【classpath:/】下创建【config/】文件,并将端口配置为:8081,启动项目:
我们发现,即使【classpath:/】下的application.yml未注销的情况下,启动端口依然变成了:8081。
接着,我们再在【file:./】下配置端口为:8082,启动项目:
接着,我们再在【file:./】下创建【config/】文件,并将端口配置为:8083,启动项目:
经过测试,我们发现这四个位置的配置文件都是可以在Springboot 启动时被读取的,优先级存在以下关系:file:./config/ > file:./ > classpath:/config/ > classpath:/。
然后我们在【classpath:/】下的配置文件中配置访问路径为:/test , 启动项目:
我们发现,除了项目虽然采用了最高优先级的启动端口,但是同时因为最高优先级没有设置启动的路由,所以Spring Boot依然读取了低优先级的配置,所以,Spring Boot采用的是一种互补配置,即:最高优先级会覆盖低优先级的配置,但是同时也会读取低优先级中,在高优先级所没有的配置信息。
更改默认的配置文件位置
我们可以使用【–spring.config.location=】来更改已经打成Jar包的配置文件。
首先,我们将复制一份application.yml文件到项目目录外(我选择放在D盘下),并将配置文件中的启动端口更改为:8085。
然后我们将项目打成Jar包:
然后进入控制台:
执行命令行:
java -jar springboot-04-0.0.1-SNAPSHOT.jar --spring.config.location=D:\application.yml
然后我们就发现,启动的端口变成了:8085端口。
但是需要注意的是:项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置,但是指定的配置文件和默认加载的这些配置文件依然是共同起作用形成互补配置;
总结
配置文件具有优先级,高优先级的配置会覆盖低优先级的配置,且SpringBoot会从这四个位置全部加载主配置文件形成互补配置;同时,我们还可以通过spring.config.location命令来改变默认的配置文件位置。但同时需要注意的是:我们项目在打包成Jar包的过程中,【file:./config/】、【–file:./】下的配置文件是不会被打包的,例如,我们直接运行上面打包好的Jar包,我们发现运行的端口为:8081,
所以,我们就需要了解下面的外部配置文件加载。
外部配置文件加载
SpringBoot官方给出了17种加载的方式,有兴趣的小伙伴可以自行参考:官方文档
我们演示一下其中几个:
1.命令行参数
例如,我们通过命令行指定Jar包的启动端口为:8086,
我们发现,启动端口就已经被更改为:8086了。
2.Jar包外部的配置文件
加入当我们需要修改多个配置信息时,我们就可以编写一个新的配置文件上传,例如:我们创建一个新的文件夹【test】,并将Jar吧和将启动端口更改为:8087的配置文件放在里面:
然后,我们运行
我们就发现启动端口已经被更改。
总结
我们对于更改一些比较少的配置信息,我们可以通过命令行的形式实现,但是如果我们更改的内容比较多,我们就可以通过编写新的配置文件的方式实现,其中:配置文件由jar包外向jar包内进行寻找,即:jar包外的配置文件优先级高于jar包内的。
多环境切换
我们在进行多环境文件配置时,我们可以使用: application-{profile}.yml的方式进行命名,例如:
然后,我们在三个配置中,分别设置为:
application.yml
server:
port: 8083
application-dev.yml
server:
port: 8084
application-prod.yml
server:
port: 8085
然后,我们重新启动项目:
我们发现端口依然是:8083,那么证明:Spring Boot**默认使用application.properties的配置**;
那么,我们如何将使用其他配置呢?
我们将application.yml修改为:
server:
port: 8083
spring:
profiles:
active: dev
然后,我们再次启动项目:
发现,端口就已经变成了:application-dev.yml文件中的内容,同理,如果我们将【active】的值赋为【prod】,那么就将使用application-prod.yml中的配置文件,这里我们就不再演示。
或许,你会得写这么多的配置文件会不会有点麻烦呢?那么YAML的优势就显示出来了,我们可以使用YAML文件的文档块来进行配置:(先将application-dev.yml、application-prod.yml文件中的内容进行注释)
application.yml
server:
port: 8083
spring:
profiles:
active: prod
---
server:
port: 8084
spring:
profiles: dev #指定属于哪个配置文件
---
server:
port: 8085
spring:
profiles: prod
我们再重新启动项目:
启动的端口就已经变成了:8085。
除此之外,我们还可以通过指定命令行的方式指定配置文件,命令为:
spring.profiles.active=dev
这里就不再演示。
源码地址
总结:
Spring Boot中的配置文是具有优先级制度的,总体上是:高优先级将覆盖低优先级的配置,同时进行互补配置。对于Jar包来说,jar包外的优先级高于Jar包内的,带有spring.profiles的高于不带的。