Spring YAML使用 完全指南

yaml:
yaml是json的超集,用于指定分层配置的便捷格式。
Spring支持YAML使用了SnakeYAML的解析实现。
如果SnakeYAML配置在类路径,SpringApplication类自动支持yaml配置。

如使用Starters模式,它在spring-boot-starter的依赖里。

<dependency>
      <groupId>org.yamlgroupId>
      <artifactId>snakeyamlartifactId>
      <version>1.23version>
      <scope>runtimescope>
dependency>

SnakeYAML仓库地址:
https://bitbucket.org/asomov/snakeyaml/wiki/Home


下面开始介绍YAML用法

yaml注释

#这是一行注释

读取YAML配置
spring框架提供了两个读取yaml文件的配置类:

  • YamlPropertiesFactoryBean把yaml封装为Properties
  • YamlMapFactoryBean把yaml封装为Map
environments:
	dev:
		url: https://dev.example.com
		name: Developer Setup
	prod:
		url: https://another.example.com
		name: My Cool App

上面配置会转换成以下格式

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列表使用如下

my:
  servers:
	- dev.example.com
	- another.example.com

会转换成:

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

上述列表类型配置文件可以通过spring的Binder工具类(@ConfigurationProperties)应用到配置类上。
类对应成员变量需要提供一个List或Set类型的对象(有setter方法或提供一个可变的初始化值),如下。

@Configuration
@ConfigurationProperties(prefix = "my")
public class Config {

	private List<String> servers = new ArrayList<String>();

	public List<String> getServers() {
		return this.servers;
	}
}

spring会把YAML转成properties设置在spring环境中,可以通过@Value注解访问

my:
  tests: this is a test
@Value("${my.tests}")
private String servers;

可以指定多个配置在一个文件里,使用spring.profile指明使用哪个。

targetAddr:
  address: 192.168.1.100
---
spring:
  profiles: development
targetAddr:
  address: 127.0.0.1
---
spring:
  profiles: production & eu-central
targetAddr:
  address: 192.168.1.120

上面的配置文件,如果profiles为development,address为127.0.0.1。 如果profiles为production和eu-central,address为192.168.1.120。 如果都没匹配上,address为192.168.1.100。

可以同时指定多个激活配置。通过逗号分隔。都满足才启用。

spring:
  profiles:
    active: production,eu-central

配置文件还可以通过表达式来表示。如 production & (eu-central | eu-west),表示同时满足 production eu-central 或者 production eu-west。
参考文档:https://docs.spring.io/spring/docs/5.1.9.RELEASE/spring-framework-reference/core.html#beans-definition-profiles

如果没有显式的声明任何激活配置,默认配置将会生效,default。

server:
  port: 8000
---
spring:
  profiles: default
  security:
    user:
      password: weak

此外,如果没匹配上任何配置,以下配置如果必要,会在所有环境都复制一份。公共配置。

server:
  port: 8000
spring:
  security:
    user:
      password: weak

YAML缺点

  • 不能被@PropertySource加载。@PropertySource只能加载properties文件。
  • 可能会导致一些意想不到的的问题。 不要过度使用
    例如,在application-dev.yml配置配置 !test 除了test环境都不能使用,自然dev也不能使用。相互矛盾。
server:
  port: 8000
---
spring:
  profiles: !test
  security:
    user:
      password: weak

你可能感兴趣的:(Spring,Spring,Boot)