配置文件
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 而非自动扫描方式注册了 @EnableConfigurationProperties 个 Bean,则需要在带有 @EnableConfigurationProperties 注解的 @Configuration 类上显式指定 @Profile 注解。
而在对 @ConfigurationProperties 进行扫描的情况下,@Profile 可以直接指定在 @ConfigurationProperties 类本身上。 |
您可以使用一个 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.active 和 spring.profiles.default 仅可在非特定配置文件的文档中使用。
这意味着它们不能包含在 特定配置文件的文件 中,也不能包含在由 spring.config.activate.on-profile 激活的文档 中。
例如,第二个文档配置无效:
-
Properties
-
YAML
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 Boot 中的配置文件名称可包含字母、数字或允许的字符( 此限制有助于防止常见的解析问题。
但是,如果您希望使用更灵活的配置文件名称,则可以在您的
|
添加激活的配置文件
有时,拥有能够追加到当前激活的配置文件(profiles)而非替换它们的属性会很有用。
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 激活的文档 中。 |
配置文件组(在下一节中介绍)也可用于在指定配置文件处于激活状态时添加激活的配置文件。
配置文件组
有时,您在应用程序中定义和使用的配置文件过于细粒度,导致使用起来十分繁琐。
例如,您可能拥有 proddb 和 prodmq 两个配置文件,分别用于独立启用数据库和消息传递功能。
为帮助实现这一点,Spring Boot 允许您定义配置文件组。 配置文件组允许您为一组相关的配置文件定义一个逻辑名称。
例如,我们可以创建一个包含 proddb 和 prodmq 配置文件的 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 一次性激活 production、proddb 和 prodmq 配置文件来启动。
以编程方式设置配置文件
您可以通过在应用程序运行前调用 SpringApplication.setAdditionalProfiles(…) 以编程方式设置激活的配置文件。
此外,也可以通过使用 Spring 的 ConfigurableEnvironment 接口来激活配置文件。
面向特定配置文件的配置文件
针对特定配置文件的 application.properties(或 application.yaml)变体,以及通过 @ConfigurationProperties 引用的文件,均被视为配置文件并被加载。
详情请参阅 特定配置文件的文件。