profiles

Spring Profiles 提供了一种方法,用于隔离应用程序配置的部分内容,并使其仅在特定环境中可用。 任何 @Component@Configuration@ConfigurationProperties 都可以使用 @Profile 进行标记,以限制其加载时机,如下例所示:spring-doc.cadn.net.cn

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;

@Configuration(proxyBeanMethods = false)
@Profile("production")
public class ProductionConfiguration {

	// ...

}
import org.springframework.context.annotation.Configuration
import org.springframework.context.annotation.Profile

@Configuration(proxyBeanMethods = false)
@Profile("production")
class ProductionConfiguration {

	// ...

}
如果 @ConfigurationProperties Bean 是通过 @EnableConfigurationProperties 注册的,而不是通过自动扫描,那么需要在带有 @EnableConfigurationProperties 注解的 @Configuration 类上指定 @Profile 注解。 在扫描 @ConfigurationProperties 的情况下,@Profile 可以直接指定在 @ConfigurationProperties 类本身上。

您可以使用 spring.profiles.active Environment 属性来指定哪些配置文件处于激活状态。 您可以按照本章前面描述的任何方式来指定该属性。 例如,您可以将其包含在您的 application.properties 中,如下例所示:spring-doc.cadn.net.cn

spring.profiles.active=dev,hsqldb
spring:
  profiles:
    active: "dev,hsqldb"

您也可以在命令行中通过以下选项指定它:--spring.profiles.active=dev,hsqldbspring-doc.cadn.net.cn

如果没有激活任何配置文件,则会启用默认配置文件。 默认配置文件的名称是 default,可以使用 spring.profiles.default Environment 属性进行调整,如下例所示:spring-doc.cadn.net.cn

spring.profiles.default=none
spring:
  profiles:
    default: "none"

spring.profiles.activespring.profiles.default 只能在非配置文件特定文档中使用。 这意味着它们不能包含在 特定配置文件的文件 或由 xref page 激活的 文档中spring-doc.cadn.net.cn

例如,第二个文档配置无效:spring-doc.cadn.net.cn

spring.profiles.active=prod
#---
spring.config.activate.on-profile=prod
spring.profiles.active=metrics
# this document is valid
spring:
  profiles:
    active: "prod"
---
# this document is invalid
spring:
  config:
    activate:
      on-profile: "prod"
  profiles:
    active: "metrics"

spring.profiles.active 属性遵循与其他属性相同的排序规则。 最高的 PropertySource 获胜。 这意味着您可以在 application.properties 中指定激活的配置文件,然后通过命令行开关来替换它们。spring-doc.cadn.net.cn

请参阅 外部配置”部分,了解在考虑属性来源的顺序上更多详情。

默认情况下,Spring Boot 中的配置文件名可以包含字母、数字或允许的字符(-_.+@)。 此外,它们只能以字母或数字开头和结尾。spring-doc.cadn.net.cn

此限制有助于防止常见的解析问题。 然而,如果您更喜欢更具灵活性的配置文件名称,可以将 spring.profiles.validate 设置为 false 在您的 application.propertiesapplication.yaml 文件中:spring-doc.cadn.net.cn

spring.profiles.validate=false
spring:
  profiles:
    validate: false

添加激活的配置文件

有时,拥有能够添加到当前激活配置文件的属性(而不是替换它们)是非常有用的。 spring.profiles.include 属性可用于在由 spring.profiles.active 属性激活的配置文件之上添加其他激活的配置文件。 SpringApplication 入口点还提供了一个用于设置额外配置文件的 Java API。 请参阅 SpringApplication 中的 setAdditionalProfiles() 方法。spring-doc.cadn.net.cn

例如,当运行具有以下属性的应用程序时,即使使用--spring.profiles.active开关运行,common和local配置文件也会被激活:spring-doc.cadn.net.cn

spring.profiles.include[0]=common
spring.profiles.include[1]=local
spring:
  profiles:
    include:
      - "common"
      - "local"
包含的配置文件会在任何 spring.profiles.active 配置文件之前被添加。
spring.profiles.include 属性会针对每个属性源进行处理,因此列表的常规复杂类型合并规则不适用。
spring.profiles.active 类似,spring.profiles.include 只能在非特定于配置文件(non-profile-specific)的文档中使用。 这意味着它不能包含在特定于配置文件的文件中,也不能包含在通过 xref page 激活的文档中。

配置文件组(在下一节中描述)也可用于在给定配置文件处于激活状态时添加激活的配置文件。spring-doc.cadn.net.cn

配置文件组

偶尔您在应用程序中定义和使用的配置过于细化,使用起来会变得繁琐。 例如,您可能有proddbprodmq配置,用来独立启用数据库和消息功能。spring-doc.cadn.net.cn

要实现这一点,Spring Boot 允许你定义配置组。 配置组允许你为一组相关的配置定义一个逻辑名称。spring-doc.cadn.net.cn

例如,我们可以创建一个production组,由我们的proddbprodmq配置文件组成。spring-doc.cadn.net.cn

spring.profiles.group.production[0]=proddb
spring.profiles.group.production[1]=prodmq
spring:
  profiles:
    group:
      production:
      - "proddb"
      - "prodmq"

我们的应用现在可以使用--spring.profiles.active=production启动,一次性激活productionproddbprodmq配置文件。spring-doc.cadn.net.cn

类似于spring.profiles.activespring.profiles.includespring.profiles.group只能在非特定配置文件的文档中使用。 这意味着它不能包含在特定配置文件的文件或通过xref page激活的文档中。

以编程方式设置配置文件

您可以在应用程序运行之前通过调用 SpringApplication.setAdditionalProfiles(…​) 以编程方式设置活动配置文件。 也可以通过使用 Spring 的 ConfigurableEnvironment 接口来激活配置文件。spring-doc.cadn.net.cn

特定于配置文件的配置文件

application.properties(或application.yaml)的特定配置文件变体,以及通过@ConfigurationProperties引用的文件,均被视为配置文件并被加载。 详见特定于配置文件的文件spring-doc.cadn.net.cn