20220511 Core Features - 3. Profiles

前言

文档地址

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

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

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

    // ...

}

如果 @ConfigurationProperties bean 是通过 @EnableConfigurationProperties 注册而不是自动扫描注册的,则 @Profile 需要在有 @EnableConfigurationProperties 注解的 @Configuration 注解的类上指定。在 @ConfigurationProperties 被扫描的情况下,@Profile 可以在 @ConfigurationProperties 类本身上指定。

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

spring.profiles.active=dev,hsqldb

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

如果没有 profile 处于活动状态,则启用默认 profile 。默认 profile 的名称是 default ,并且可以使用 Environment 属性 spring.profiles.default 进行调整,如以下示例所示:

spring.profiles.default=none

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

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

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

3.1. 添加活动的 profile

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

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

例如,当运行具有以下属性的应用程序时,即使使用 --spring.profiles.active 开关运行,也会激活 commonlocal profile :

spring.profiles.include[0]=common
spring.profiles.include[1]=local

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

如果给定的 profile 处于活动状态,则在下一节 中描述的 profile 组也可用于添加活动 profile 。

3.2. profile 组

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

为了帮助解决这个问题,Spring Boot 允许您定义 profile 组。 profile 组允许您为相关的 profile 组定义逻辑名称。

例如,我们可以创建一个由我们的 proddbprodmq profile 组成的 production 组。

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

我们的应用程序现在可以启动,--spring.profiles.active=production 激活 production , proddbprodmq profile 。

3.3. 以编程方式设置 profile

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

3.4. 特定 profile 的配置文件

application.properties(或 application.yml )和通过 @ConfigurationProperties 引用的文件的特定 profile 变体被视为文件并加载。有关详细信息,请参阅 特定 profile 文件

posted @ 2022-06-08 07:50  流星<。)#)))≦  阅读(30)  评论(0编辑  收藏  举报