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.com
name: Developer Setup
prod:
url: https://another.example.com
name: My Cool App
为了从Environment
中访问这些属性,它们将按如下所示展平:
environments.dev.url=https://dev.example.com
environments.dev.name=Developer Setup
environments.prod.url=https://another.example.com
environments.prod.name=My Cool App
同样,YAML列表也需要展平。它们用[index]
解引用器表示属性键。 例如,考虑以下YAML:
my:
servers:
- dev.example.com
- another.example.com
前面的示例将转换为如下属性:
my.servers[0]=dev.example.com
my.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文档。坚持只使用其中一种。