Spring Cloud配置application.yml与bootstrap.yml区别及多profile配置 | Spring Cloud 6
一、前言
Spring Cloud
构建于 Spring Boot
之上,在 Spring Boot
中有两种上下文,一种是 bootstrap
,另外一种是 application
。
1.1 两者区别
bootstrap.yml/bootstrap.properties
和 application.yml/application.yml
都可以用来配置参数。
-
bootstrap.yml/bootstrap.properties
:用来程序引导时执行,应用于更加早期配置信息读取。可以理解成系统级别的一些参数配置,这些参数一般是不会变动的。 -
application.yml/application.yml
:可以用来定义应用级别的, 应用程序特有配置信息,可以用来配置后续各个模块中需使用的公共参数等。如果搭配alibaba-nacos-config
使用,application.yml/application.yml
里面定义的文件可以实现动态替换。
文件名.properties /文件名.yml
文件名相同且同时存在时,文件类型properties
的优先级高于yaml/yml
。
1.2 配置文件目录加载顺序
配置文件可以存在 4 个地方,按优先级从高到低是
- 项目根目录下的
config
文件夹 - 项目根目录
classpath
下的 config
文件夹classpath
1.3 application和bootstrap加载顺序
若application.yml/.properties
和 bootstrap.yml/.properties
在同一目录下:bootstrap
先加载,application
后加载
bootstrap
用于创建初始化 Bootstrap Context
。application
用于创建初始化Application Context
。
bootstrap
和 application
共享同一个 Environment
。Environment
它是任何 Spring
应用程序的外部属性的来源。bootstrap
属性以高优先级添加,因此默认情况下它们不能被本地配置覆盖
。而 application
的配置项可以被覆盖(比如被application-dev
覆盖,或被 java
命令行覆盖)。
可通过参数spring.cloud.bootstrap.enabled=true
完全禁用bootstrap
。
1.4 bootstrap应用
- 配置
alibaba-nacos-config
基本连接信息,用于获取远程所需配置。alibaba-nacos-config
基本连接信息就不能写到application.yml/.properties
中等到Application Context
初始化时才读取。必须在bootstrap.yml/.properties
里配置,在初始化Bootstrap Context
时完成读取, 在Application Context
初始化时利用已读取的alibaba-nacos-config
基本连接信息从alibaba-nacos-config
中获取所需的远程配置信息。 - 一些固定的不希望被覆盖的属性,如程序的名字。
- 一些加解密的场景。
二、application多profile配置
3.1 启动时No active profile set, falling back to 1 default profile: “default”
相信有不少细心小伙伴在新启动一个spring boot
项目时候会发现这样一条信息no active profile set, falling back to default profiles: default
。为什么会出现这样的提示呢,我们先来看看profile
,profile
是Spring对不同环境提供不同配置功能的支持,可以通过激活、 指定参数等方式快速切换环境profile
。举个例子我们在开发,测试,生产用到的配置是不同的,那么通过profile
就可以帮我们指定对应的环境用对应的配置,那么如何来指定呢?
3.2 多profile文件形式
格式:application-{profile}.properties/yml
如:
application-dev.properties/yml
application-test.properties/yml
application-prod.properties /yml
3.3 多profile在application配置激活
在application.properties/yml
中配置
spring.profiles.active=dev
或
spring:profiles:active: dev
进行配置激活。
Spring Boot
在加载 application.properties/yml
后还会加载 application-dev.properties/yml
并且如果两个文件有相同的配置项,那么 application.properties/yml
的会被 application-dev.properties/yml
覆盖。
- 多个文件中,有同一个值,以先加载的为准(即先加载的优先级最高)。
- 即优先级高的
yml/.properties
中有的值,在优先级低的yml/properties
中就不做加载;但若高优先级yml/properties
中没有的值,低优先级yml/.properties
中要加。