SpringBoot配置文件还能这么玩,你知道吗?

B站影视 2025-01-24 10:07 2

摘要:在之前的一篇文章中,我们已经对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: - prod

spring.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才会生效。

来源:散文随风想

相关推荐