摘要:在之前的一篇文章中,我们已经对Spring Boot配置文件进行了详细的探讨和介绍。文章深入解析了Spring Boot如何从不同的来源加载配置属性,包括但不限于application.properties或application.yml文件、命令行参数、系统
1. 简介
在之前的一篇文章中,我们已经对Spring Boot配置文件进行了详细的探讨和介绍。文章深入解析了Spring Boot如何从不同的来源加载配置属性,包括但不限于application.properties或application.yml文件、命令行参数、系统环境变量等。建议下阅读下面这篇文章:
《一文彻底搞明白SpringBoot外部化配置文件》
在Spring Boot项目中我们通常都会为不同的环境提供不同的配置文件,如:开发、 测试、生产在这3个环境中定义不同的配置信息。如下示例:
针对不同的环境提供不同的配置文件application-{profile}.yml。而具体使用哪个配置文件,通过如下配置方式指定:
application.yml指定spring: profiles: active: - prodspring.profiles.active是个List集合,所以这里我们可以配置多个。
通过命令行参数指定java -jar app.jar --spring.profiles.active=prod通过spring.profiles.active属性激活配置文件,有如下缺点:
灵活性该属性属于全局设置,一旦设置影响的是整个配置加载;这样显然不够灵活,粒度太粗了。组织结构更侧重于通过文件命名约定来组织和区分不同环境的配置。接下来,我们将介绍另外一种激活配置的方式
spring.config.activate.on-profile
2. 处理多文档文件
首先我们要介绍的是关于SpringBoot多文档文件。
2.1 多文档简介
Spring Boot 允许你将单个物理文件分割成多个逻辑文档,每个文档都是独立添加的。文档按从上到下的顺序处理。后面的文档可以覆盖前面文档中定义的属性。
对于 application.yml 文件,使用标准的 YAML 多文档语法。三个连续的连字符"---"代表一个文档的结束和下一个文档的开始。示例如下:
spring: application: name: pack-app---logging: pattern: dateformat: yyyy-MM-dd HH:mm ---spring: profiles: active: - prod如果你使用的properties格式,那么是通过如下方式
spring.application.name=pack-app#---logging.pattern.dataformat=yyyy-MM-dd HH:mm了解了上面的基础知识后,接下来我们就来介绍如何使用spring.config.activate.on-profile配置属性。
2.2 激活特定文件
有时,只有在满足特定条件时才能激活特定的属性集。例如,可能有一些属性只有在特定配置文件处于活动状态时才有用。这时候我们就可以使用 spring.config.activate.* 有条件地激活属性文档。示例如下:
spring: profiles: active: - test - live---pack.app: name: dev appspring.config.activate: on-profile: - dev---pack.app: name: test appspring.config.activate: on-profile: - test---pack.app: name: prod appspring.config.activate: on-profile: - prod根据这里spring.profiles.active配置的不同profile,激活下面不同的逻辑文档。
如上配置示例,输出结果
@Value("${pack.app.name}")private String appName ;// 输出test app这样在一个配置文件中就控制了不同的配置信息。
如果我们没有指定spring.profiles.active结果或者是设置的profile不存在下面配置的又会如何呢?控制台将会输出错误
如果没有配置,或者激活的不存在那么这些逻辑文档将不会生效。
除此之外,我们可以通过如下属性指定运行的云平台。
spring.config.activate: on-cloud-platform: xxx该on-cloud-platform属性支持如下属性:
这些云平台又是如何验证的呢?我们以kubernetes为例说明:
public enum CloudPlatform { KUBERNETES { private static final String KUBERNETES_SERVICE_HOST = "KUBERNETES_SERVICE_HOST"; private static final String KUBERNETES_SERVICE_PORT = "KUBERNETES_SERVICE_PORT"; public boolean isDetected(Environment environment) { if (environment instanceof ConfigurableEnvironment configurableEnvironment) { return isAutoDetected(configurableEnvironment); } return false; } private boolean isAutoDetected(ConfigurableEnvironment environment) { // 获取当前系统环境信息systemEnvironment PropertySource environmentPropertySource = environment.getPropertySources .get(StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME); if (environmentPropertySource != null) { // 判断是否存在上面定义的两个常量值信息 if (environmentPropertySource.containsProperty(KUBERNETES_SERVICE_HOST) && environmentPropertySource.containsProperty(KUBERNETES_SERVICE_PORT)) { return true; } // other } return false; } }}其它平台的检测就更加简单了。完整示例如下:
---pack.app: name: dev appspring.config.activate: on-cloud-platform: kubernetes on-profile: - dev---当前运行的平台必须是kubernetes,并且激活的配置必须是dev才会生效。
来源:散文随风想