配置文件

Spring Profiles 提供了一种方式来隔离应用程序配置的各个部分,并使其仅在特定环境中可用。 任何 @Component@Configuration@ConfigurationProperties 都可以用 @Profile 标记,以限制其加载时机,如下例所示:

  • Java

  • Kotlin

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 被扫描的情况下,可以在 @ConfigurationProperties 类本身上指定 @Profile

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

  • Properties

  • YAML

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

你也可以使用以下开关在命令行上指定它:--spring.profiles.active=dev,hsqldb

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

  • Properties

  • YAML

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

spring.profiles.activespring.profiles.default 只能在非特定配置文件的文档中使用。 这意味着它们不能包含在 特定配置文件 或由 spring.config.activate.on-profile 激活的文档 中。

例如,第二个文档配置是无效的:

  • Properties

  • YAML

spring.profiles.active=prod
#---
spring.config.activate.on-profile=prod
spring.profiles.active=metrics
# 这个文档是有效的
spring:
  profiles:
    active: "prod"
---
# 这个文档是无效的
spring:
  config:
    activate:
      on-profile: "prod"
  profiles:
    active: "metrics"

spring.profiles.active 属性遵循与其他属性相同的排序规则。 最高的 PropertySource 获胜。 这意味着你可以在 application.properties 中指定活动配置文件,然后使用命令行开关*替换*它们。

有关属性源考虑顺序的更多详细信息,请参阅 "外部化配置"

添加活动配置文件

有时,拥有*添加*到活动配置文件而不是替换它们的属性很有用。 spring.profiles.include 属性可用于在由 spring.profiles.active 属性激活的配置文件之上添加活动配置文件。 SpringApplication 入口点还有一个用于设置其他配置文件的 Java API。 请参阅 SpringApplication 中的 setAdditionalProfiles() 方法。

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

  • Properties

  • YAML

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 只能在非特定配置文件的文档中使用。 这意味着它不能包含在 特定配置文件 或由 spring.config.activate.on-profile 激活的文档 中。

配置文件组(在 下一节 中描述)也可以用于在给定配置文件处于活动状态时添加活动配置文件。

配置文件组

有时,你在应用程序中定义和使用的配置文件过于细化,使用起来变得很麻烦。 例如,你可能拥有 proddbprodmq 配置文件,用于独立启用数据库和消息传递功能。

为了帮助解决这个问题,Spring Boot 允许你定义配置文件组。 配置文件组允许你为相关配置文件组定义逻辑名称。

例如,我们可以创建一个由 proddbprodmq 配置文件组成的 production 组。

  • Properties

  • YAML

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

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

spring.profiles.activespring.profiles.include 类似,spring.profiles.group 只能在非特定配置文件的文档中使用。 这意味着它不能包含在 特定配置文件 或由 spring.config.activate.on-profile 激活的文档 中。

以编程方式设置配置文件

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

特定配置文件的配置文件

application.properties(或 application.yaml)的特定配置文件变体以及通过 @ConfigurationProperties 引用的文件都被视为文件并加载。 有关详细信息,请参阅 特定于配置文件的文件