1 概述
YAML全称是YAML Ain’t Markup Language。YAML是一种直观的能够被电脑识别的的数据数据序列化格式,并且容易被人类阅读,容易和脚本语言交互的,可以被支持YAML库的不同的编程语言程序导入,比如: C/C+ +, Ruby, Python,Java, Perl,C#, PHP等。YML文件是以数据为核心的,比传统的xml方式更加简洁。
YAML文件的扩展名可以使用.yml或者.yaml。
2 各种数据格式的对比
properties:
server.port=8080
server.address=127.0.0.1
xml:
<server>
<port>8080</port>
<address>127.0.0.1</address>
</server>
yml:冒号后面有一个空格
server:
port: 8080
address: 127.0.0.1
通过格式对比可以发现:yml更加简洁,以数据为核心
3 基本语法
大小写敏感
数据值前边必须有空格,作为分隔符
使用缩进表示层级关系
缩进时不允许使用Tab键,只允许使用空格(各个系统Tab对应的空格数目可能不同,导致在不同操作系统上出现层次混乱,但是在idea里面就不用注意了,idea会进行自动的转换
)。
缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
#
表示注释,从这个字符一直到行尾,都会被解析器忽略。
server:
port: 8080
address: 127.0.0.1
name: abc
4 数据格式
对象(map):键值对的集合。
person :
name: zhangsan
#行内写法,冒号后面有空格
person: {name: zhangsan}
数组:一组按次序排列的值
address:
- beijing # 横杆(-)后面有一个空格
- shanghai
#行内写法
address: [beijing,shanghai]
纯量:单个的、不可再分的值
msg1 : 'hello /n world' #单引忽略转义字符,会将/n显示出来,忽略转义字符
msg2 : "hello /n world" #双引识别转义字符,会将/n识别,将来会被分两行被输出
-
基本语法
1.大小写敏感
2.数据值前边必须有空格,作为分隔符
3.使用空格缩进表示层级关系,相同空格缩进表示同一级 -
数据格式
1.对象
2.数组:使用“-”表示数组每个元素
3.纯量
5 参数引用${key}
name: lisi
person:
name: ${name}#引用上边定义的name值
6 读取配置文件内容
获取方式有以下三种方式:
- @Value
注解的方式
- Environment
通过环境对象获取
- @ConfigurationProperties
使用这个注解,使我们的配置文件内容和对象做一个映射这样的关系
在下面的获取方法中,获取下面yml文件里面的内容
name: abc
#对象
person:
name: wangwu
age: 20
# 数组
address:
- beijing
- shanghai
# 纯量
msg1: 'hello \n world'
msg2: "hello \n world"
6.1 @value
package com.yy.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
//通过@value获取yml文件里面的name属性
@Value("${name}")
private String name;
//获取对象中的属性
@Value("${person.name}")
private String OName;
//获取数组里面的:获取数组中索引为0的数据
@Value("${address[0]}")
private String address;
@Value("${msg1}")
private String msg1;
@Value("${msg2}")
private String msg2;
@RequestMapping("/hello")
public String hello(){
System.out.println("name: abc:"+name);
System.out.println("对象中的:"+OName);
System.out.println("数组中的:"+address);
System.out.println("纯量中的msg1:"+msg1);
System.out.println("纯量中的msg2:"+msg2);
return "hello spring boot";
}
}
运行结果:
6.2 Environment
在配置文件中的值的数量比较小的时候,使用@value,当比较多的时候还是使用Environment
package com.yy.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@Autowired
private Environment env;//这个包下面的:org.springframework.core.env.Environment;
@RequestMapping("/hello")
public String hello(){
//通过下面的方法知道键的名称,就可以获取值
//名称与在之前通过@Value里面的名称一样
System.out.println(env.getProperty("name"));
System.out.println(env.getProperty("address[0]"));
return "hello spring boot";
}
}
6.3 @ConfigurationProperties
这种配置方式,其实就是让配置内容和对象进行相互绑定的一种方式
# 获取如下的数据
#对象
person:
name: wangwu
age: 20
address:
- beijing
- shanghai
对象
package com.yy;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Arrays;
@Component
//在注入时,需要注意是去注入哪一个前缀下的属性
@ConfigurationProperties(prefix = "person")
public class Person {
//name和age的get和set方法的名字,必须跟配置文件中的名字保持一致
private String name;
private int age;
private String[] address;
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAddress(String[] address) {
this.address = address;
}
public String[] getAddress() {
return address;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", address=" + Arrays.toString(address) +
'}';
}
}
测试方法
package com.yy.controller;
import com.yy.Person;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@Autowired
private Person person;
@RequestMapping("/hello")
public String hello(){
System.out.println(person);
return "hello spring boot";
}
}
运行结果: