SpringBoot --> 五、多环境切换配置及内外部配置文件位置的加载
ref. 狂神说
文章目录
5. 多环境切换及配置文件位置加载顺序
5.1 多环境切换配置
profile是Spring对不同环境提供不同配置功能的支持,可以通过激活不同的环境版本,实现快速切换环境。
5.1.1 多配置文件
-
在主配置文件编写的时候,文件名可以是
application-{profile}.properties/yml
,用来指定多个环境版本;如:-
application-test.properties
代表测试环境配置文件 -
application-dev.properties
代表开发环境配置文件 -
application-prod.properties
代表生产环境配置文件
-
-
SpringBoot默认启动命名为application.properties的主配置文件,因此需要通过一个配置让SpringBoot启动所选中的环境配置文件。比如指定使用dev环境:
spring.profiles.active=dev
一个简单的测试
-
分别新建配置文件
application-test.properties
和application-dev.properties
,分别配置不同的端口号进行测试;application-dev.properties
server.port=8555
application-test.properties
server.port=8080
-
在主配置文件
application.properties
中分别配置指定环境激活测试spring.profiles.active=test
启动应用查看:
-
切换另一个环境再次测试
spring.profiles.active=dev
5.1.2 yaml多文档块
-
使用yaml配置文件也可以像上述properties这种方式创建多个
application-{profile}.yml
配置多环境; -
yaml也可以使用单个文件配置多环境,使用
---
把配置文件分割为多文档块;比如:application.yml
# 默认配置 server: port: 8080 # 切换激活不同环境 spring: profiles: active: prod --- # 测试环境 server: port: 8081 spring: config: activate: on-profile: test --- # 开发环境 server: port: 8555 spring: config: activate: on-profile: dev --- # 生产环境 server: port: 8083 spring: config: activate: on-profile: prod
-
注意:在Spring2.4以后在配置特定环境时,使用
spring: profiles: {profile}
提示被弃用了:因此修改为以下写法:
spring: config: activate: on-profile: test
如果yml和properties同时都配置了端口,并且没有激活其他环境 ,默认会使用properties配置文件的!
5.2 配置文件位置的加载顺序
application.properties/yml作为SpringBoot项目的全局配置文件。可以通过
application-{profile}.properties/yml
来配置多环境切换。到目前为止,这些配置文件都放在指定位置classpath:/
下生效的,即resources/目录下。SpringBoot项目启动时还可以加载其他位置的配置文件,如下介绍。
5.2.1 内部配置文件
-
全局配置文件放在项目如下路径,这些都属于项目的内部配置文件,都可以被SpringBoot加载到:
file:./config/
file:./
classpath:/config/
classpath:/
-
以上这四种路径下的配置文件,加载的优先级由高到低,都可以被SpringBoot加载到。相同配置的话,高优先级会覆盖低优先级;不同配置的话,它们之间互补都有效。
-
四个路径在项目中的具体位置,以yaml为例,示例如下:
-
以上四种路径下的配置文件
application.properties
优先级都要大于application.yml
,如果在不同的目录中存在多个配置文件,它的读取顺序如下:config/application.properties
(项目根目录中config目录下file:./config/
)config/application.yml
application.properties
(项目根目录下file:./
)application.yml
resources/config/application.properties
(项目resources目录中config目录下classpath:/config/
)resources/config/application.yml
resources/application.properties
(项目的resources目录下classpath:/
)resources/application.yml
-
注意!使用Maven打包项目时,Maven不会把 src目录外的内容打到 jar 包之内,所以导致
file:./config/
、file:./
这两种方式的配置不生效。此时这种情况,可以通过--spring.config.location
命令参数的方式来指定配置文件的新位置:java -jar .\hello-0.0.1-SNAPSHOT.jar --spring.config.location=E:/JavaAno/code/springBoot/ springboot-01-hello/config/application.yml
5.2.2 外部配置文件
-
SpringBoot也可以从项目外部位置加载配置文件,优先级由高到低:
-
命令行参数;
所有的配置都可以在命令行上进行指定,多个配置用空格分开;配置项=值
// 示例 java -jar .\hello-0.0.1-SNAPSHOT.jar --server.port=8087 --server.context-path=/hello
-
来自java:comp/env的NDI属性;
-
Java系统属性(System.getProperties() );
-
操作系统环境变量;
-
RandomValuePropertySource配置的random.*属性值;
-
jar包内外部的配置文件;
优先级由高到低:
- jar包外部的
application-{profile}.properties/yml
(带spring.profile)配置文件 - jar包内部的
application-{profile}.properties/yml
(带spring.profile)配置文件
再来加载不带profile - jar包外部的
application.properties/yml
(不带spring.profile)配置文件 - jar包内部的
application.properties/yml
(不带spring.profile)配置文件
jar包外部的配置文件需和jar包在同一个路径文件下
- 一个示例:
这种方式直接通过java -jar xxx.jar的方式启动,不需要额外添加–参数了,如果需要启动指定环境,则需要将该环境配置文件添加到同一目录下,同时在全局配置文件
application.properties/yml
中配置spring.profiles.active=profileName
。 - jar包外部的
-
@Configuration注解类上的propertySource;
-
通过SpringApplication.setDefaultProperties指定的默认属性。
-