YAML是什么

YAML 语言(发音 /ˈjæməl/ )的设计目标,就是方便人类读写。它实质上是一种通用的数据串行化格式,常用语作配置文件。
它的基本语法规则如下。

  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进时不允许使用Tab键,只允许使用空格。
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

表示注释,从这个字符一直到行尾,都会被解析器忽略。

YAML基本用法

基本句式: K:空格V

字符串

字符串是最常见,也是最复杂的一种数据类型。
字符串默认不使用引号表示。

  1. hello: 你好

双引号:不会转义特殊字符:

  1. name: "test \n test2"
  2. 输出:
  3. test
  4. test2

单引号:会转义特殊字符

  1. name:'test \n test2'
  2. 输出:test \n test2

其他基本类型

  • 字符串
  • 布尔值
  • 整数
  • 浮点数
  • Null
  • 时间
  • 日期

直接使用字面量表示。

对象(两种方式)

  1. user:
  2. username: 张三
  3. password: 123456

或写成行内对象

  1. user: { username: 张三, password: 123456}

数组

一组连词线开头的行,构成一个数组。

  1. user
  2. - zhangsan
  3. - lisi
  4. - wangwu

Map

  1. map:
  2. k1: v1
  3. k2: v2
  4. map2: {k1:v1, k2:v2}
  5. 对应对象:
  6. private Map<String,Object> map;
  7. private Map<String,String> map2;

复合结构

  1. languages:
  2. - Ruby
  3. - Perl
  4. - Python
  5. websites:
  6. YAML: yaml.org
  7. Ruby: ruby-lang.org
  8. Python: python.org
  9. Perl: use.perl.org

SpringBoot配置

默认支持两种类型:

  • application.properties
  • application.yml

SpringBoot会把YAML解析为properties文件,如下列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

会被转换为:

  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

测试一下

application.yml文件内容:

  1. user:
  2. userName: root
  3. isAdmin: true
  4. regTime: 2019/11/01
  5. isOnline: 1
  6. maps: {k1 : v1,k2: v2}
  7. lists:
  8. - list1
  9. - list2
  10. address:
  11. tel: 15899988899
  12. name: 上海市
  13. test:
  14. text1: "test1 with \n over"
  15. text2: 'test2 \n over'
  16. map:
  17. k1: v1
  18. k2: v2
  19. map2: {k1:v1, k2:v2}

User测试类:

  1. @Component
  2. @ConfigurationProperties("user")
  3. @Data
  4. public class User {
  5. private String userName;
  6. private boolean isAdmin;
  7. private Date regTime;
  8. private Long isOnline;
  9. private Map<String,Object> maps;
  10. private List<Object> lists;
  11. private Address address;
  12. }

测试类:

  1. @SpringBootTest
  2. @RunWith(SpringRunner.class)
  3. public class SpringbootDemoApplicationTests {
  4. @Autowired
  5. private User user;
  6. @Autowired
  7. private TestProp tp;
  8. @Test
  9. public void contextLoads() {
  10. System.out.println(user);
  11. System.out.println(tp);
  12. }
  13. }

单个yml中编写多个配置(Multi-profile YAML Documents)

在一个yml文件中,通过 --- 分隔多个不同配置,根据spring.profiles.active 的值来决定启用哪个配置,例如:

  1. server:
  2. address: 192.168.1.100
  3. ---
  4. spring:
  5. profiles: development
  6. server:
  7. address: 127.0.0.1
  8. ---
  9. spring:
  10. profiles: production & eu-central
  11. server:
  12. address: 192.168.1.120

默认的server.address=192.168.100, 如果profile指定为development,那么server.address为127.0.0.1
如果profile指定为production and eu-central,那么server.address为192.168.1.120
再比如:

  1. #公共配置
  2. spring:
  3. profiles:
  4. active: pro #使用名为pro的配置,这里可以切换成dev
  5. datasource:
  6. url: jdbc:mysql://localhost:3306/test_db?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true
  7. password: 123456
  8. username: root
  9. ---
  10. #开发环境配置
  11. spring:
  12. profiles: dev #profiles属性代表配置的名称
  13. server:
  14. port: 8080
  15. ---
  16. #生产环境配置
  17. spring:
  18. profiles: pro
  19. server:
  20. port: 80

编写多个yml文件,分别代表不同的配置(Multiple YAML Documents)

将配置编写在多个yml文件中,根据spring.profiles.active 的值来决定启用哪个配置。
配置文件规则如下:

  1. 文件命名需要符合application-{profile}.yml的格式,如:application-dev.yml
  2. 通用配置写到application.yml中,不同的环境配置写到不同的yml文件中

例如:
application.yml

  1. #公共配置
  2. spring:
  3. profiles:
  4. active: pro #使用名为pro的配置,这里可以切换成dev
  5. datasource:
  6. url: jdbc:mysql://localhost:3306/test_db?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true
  7. password: 123456
  8. username: root

application-dev.yml

  1. server:
  2. port: 8080

application-pro.yml

  1. server:
  2. port: 80

官方建议

  • 两种配置方式根据团队规范而定,但如果配置很多,建议拆成多个yml文件,即方式二,便于维护
  • 注意区分二者的不同,不能混用

JVM启动

``` -Dspring.profiles.active=test,master — 可指定多个

—spring.profiles.active=dev

```

参考

https://my.oschina.net/u/1469495/blog/1522784