英文原文:https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-external-config.html#boot-features-external-configGitHub:https:///jijicai/Spring/tree/master/spring-boot
24.7、使用 YAML 代替 Properties
YAML 是 JSON 的超集,因此,它是一种用于指定分层配置数据的便捷格式。只要类路径上有 Snake YAML 库,SpringApplication 类就会自动支持 YAML 作为 properties 的替代者。
注释:如果你使用“Starters”,Snake YAML 将由 spring.boot.starter 自动提供。
24.7.1、加载 YAML
Spring Framework 提供了两个方便的类,可用于加载 YAML 文档。YamlPropertiesFactoryBean 将 YAML 加载为 Properties,YamlMapFactoryBean 将 YAML 加载为 Map。
例如,考虑下面的 YAML 文档:
environments: dev: url: https:// name: Developer Setup prod: url: https:// name: My Cool App
前面的示例将转换为以下属性:
environments.dev.url=https://environments.dev.name=Developer Setupenvironments.prod.url=https://environments.prod.name=My Cool App
YAML 列表用带有 [index] 取消引用(dereferencers)的属性键表示。例如,考虑以下 YAML:
my:servers: - -
前面的示例将转换为这些属性:
my.servers[0]=my.servers[1]=
要通过使用 Spring Boot 的 Binder 工具类(这就是 @ConfigurationProperties 所做的)绑定到类似的属性,需要在目标 bean 中有一个 java.util.List(或 Set) 类型的属性,并且需要提供 setter 或使用可变值初始化它。例如,下面的示例绑定到前面显示的属性:
@ConfigurationProperties(prefix="my")public class Config { private List servers = new ArrayList(); public List getServers() { return this.servers; }}
24.7.2、在 Spring 环境中将 YAML 作为属性公开
YamlPropertySourceLoader 类可用于在 Spring Environment 中将 YAML 公开为 PropertySource。这样就可以使用带有占位符语法的 @Value 注解来访问 YAML 属性。
24.7.3、多配置的 YAML 文档
通过使用 spring.profiles 键指示文档何时应用,可以在单个文件中指定多个特定配置的 YAML 文档,如下面示例所示:
server: address: 192.168.1.100---spring: profiles: developmentserver: address: 127.0.0.1---spring: profiles: production & eu-centralserver: address: 192.168.1.120
在上面的例子中,如果激活 development 配置,则 server.address 属性是 127.0.0.1。类似地,如果激活 production 和 eu-central 配置,则 server.address 属性是 192.168.1.120。如果未启用 development、production 和 eu-central 配置,那么该属性值是 192.168.1.100。
注释:因此,spring.profiles 可以包含一个简单的配置文件名(例如:production)或配置文件表达式。profile 表达式允许表达更复杂的 profile 逻辑,例如:production & (eu-central|eu-west)。请查看参考指南了解更多详细信息。(https://docs.spring.io/spring/docs/5.1.8.RELEASE/spring-framework-reference/core.html#beans-definition-profiles-java )
如果应用程序上下文启动时没有显示激活配置文件,则将激活默认的。因此,在下面的 YAML 中,我们为 spring.security.user.password 设置一个值,它仅在“默认”配置文件中可用:
server: port: 8000---spring: profiles: default security: user: password: weak
但是,在下面的示例中,始终设置密码,因为它没有附加到任何配置文件,并且必须在所有其他配置文件中根据需要显式重置密码:
server: port: 8000spring: security: user: password: weak
通过使用 spring.profiles 元素指定的 Spring 配置文件可以通过使用“!”字符取反。如果为单个文档同时指定了否定配置文件和非否定配置文件,则必须至少有一个非否定配置文件匹配,并且不能有否定配置文件匹配。
24.7.4、YAML 的缺点
无法使用 @PropertySource 注解加载 YAML 文件。因此,如果需要以这种方式加载值,则需要使用属性文件。
在特定配置的 YAML 文件中使用多个 YAML 文档语法可能会导致意外行为。例如,在名为 application-dev.yml 的文件中考虑以下配置,其中 dev 配置文件处于活动状态:
server: port: 8000---spring: profiles: !test security: user: password: weak
在上面的例子中,profile 否定和 profile 表达式的行为将不符合预期。我们建议你不要将特定配置的 YAML 文件和多个 YAML 文档组合在一起,而只使用其中的一个。