YAML是JSON的超集,因此是一种用于指定层次结构配置数据的便捷格式。只要在classpath有SnakeYAML库,SpringApplication类自动支持YAML作为properties的一个替代品。

info.svg 如果您使用“Starters(启动器)”,spring-boot-starter自动提供SnakeYAML支持。

2.5.1 将YAML映射到Properties

YAML文档需要从其层次结构格式转换为可以被SpringEnvironment使用的平面结构。例如,考虑以下YAML文档:

  1. environments:
  2. dev:
  3. url: https://dev.example.com
  4. name: Developer Setup
  5. prod:
  6. url: https://another.example.com
  7. name: My Cool App

为了从Environment中访问这些属性,它们将按如下所示展平:

  1. environments.dev.url=https://dev.example.com
  2. environments.dev.name=Developer Setup
  3. environments.prod.url=https://another.example.com
  4. environments.prod.name=My Cool App

同样,YAML列表也需要展平。它们用[index]解引用器表示属性键。 例如,考虑以下YAML:

  1. my:
  2. servers:
  3. - dev.example.com
  4. - another.example.com

前面的示例将转换为如下属性:

  1. my.servers[0]=dev.example.com
  2. my.servers[1]=another.example.com

灯泡.svg 可以使用Spring Boot的Binder类将使用了[index]表示法的属性绑定到Java的ListSet对象。 有关更多详细信息,请参见下面的“类型安全的配置属性”部分。

2.5.2 直接加载YAML

Spring Framework提供了两个可用于加载YAML文档的便捷类。YamlPropertiesFactoryBean将YAML加载为PropertiesYamlMapFactoryBean将YAML加载为Map
如果要将YAML加载成Spring PropertySource,也可以使用YamlPropertySourceLoader类。

2.5.3 YAML的缺点

无法通过使用@PropertySource注解加载YAML文件。因此,在需要以这种方式加载值的情况下,需要使用Properties文件。
在使用多文档YAML语法的特定配置文件的YAML文件中,可能会导致意外行为。例如,考虑文件中的以下配置:
application-dev.yml

  1. server.port: 8000
  2. ---
  3. spring.config.activate.on-profile: "!test"
  4. mypassword: "secret"

如果使用--spring.profiles.active=dev参数运行应用程序,则可能希望将mypassword设置为“secret”,但实际情况并非如此。
因为主文件名为application-dev.yml,嵌套文档将被过滤。它已经被认为是特定配置文件,嵌套文档将被忽略。

灯泡.svg 我们建议您不要混用特定配置文件的YAML文件和多文档的YAML文档。坚持只使用其中一种。