YAML是JSON的超集,因此是一种用于指定层次结构配置数据的便捷格式。只要在classpath有SnakeYAML库,SpringApplication类自动支持YAML作为properties的一个替代品。
如果您使用“Starters(启动器)”,
spring-boot-starter自动提供SnakeYAML支持。
2.5.1 将YAML映射到Properties
YAML文档需要从其层次结构格式转换为可以被SpringEnvironment使用的平面结构。例如,考虑以下YAML文档:
environments:dev:url: https://dev.example.comname: Developer Setupprod:url: https://another.example.comname: My Cool App
为了从Environment中访问这些属性,它们将按如下所示展平:
environments.dev.url=https://dev.example.comenvironments.dev.name=Developer Setupenvironments.prod.url=https://another.example.comenvironments.prod.name=My Cool App
同样,YAML列表也需要展平。它们用[index]解引用器表示属性键。 例如,考虑以下YAML:
my:servers:- dev.example.com- another.example.com
前面的示例将转换为如下属性:
my.servers[0]=dev.example.commy.servers[1]=another.example.com
可以使用Spring Boot的
Binder类将使用了[index]表示法的属性绑定到Java的List或Set对象。 有关更多详细信息,请参见下面的“类型安全的配置属性”部分。
2.5.2 直接加载YAML
Spring Framework提供了两个可用于加载YAML文档的便捷类。YamlPropertiesFactoryBean将YAML加载为Properties,YamlMapFactoryBean将YAML加载为Map。
如果要将YAML加载成Spring PropertySource,也可以使用YamlPropertySourceLoader类。
2.5.3 YAML的缺点
无法通过使用@PropertySource注解加载YAML文件。因此,在需要以这种方式加载值的情况下,需要使用Properties文件。
在使用多文档YAML语法的特定配置文件的YAML文件中,可能会导致意外行为。例如,考虑文件中的以下配置:
application-dev.yml
server.port: 8000---spring.config.activate.on-profile: "!test"mypassword: "secret"
如果使用--spring.profiles.active=dev参数运行应用程序,则可能希望将mypassword设置为“secret”,但实际情况并非如此。
因为主文件名为application-dev.yml,嵌套文档将被过滤。它已经被认为是特定配置文件,嵌套文档将被忽略。
我们建议您不要混用特定配置文件的YAML文件和多文档的YAML文档。坚持只使用其中一种。
