一、 YAML:数据格式
文章:《yaml基本语法,数据类型,对象,数组,复合结构,纯量,引用;文件后缀为.yml或.yaml》
里有一些介绍,以及我自己的理解。
这篇文章偏实战些
对象(map):键值对的集合
person:
name: zhangsan
# 行内写法
person: {name: zhangsan}
数组:一组按次序排列的值
address:
- beijing
- shanghai
# 行内写法
address: [beijing,shanghai]
纯量:单个,不可再分割的值
msg1: 'hello \n world' #单引号忽略转义字符
msg1: "hello \n world" #双引号识别转义字符
二、3 种读取方式
2.1 @Value()读取方式
@Value("${name}") //${name}里的name要和.yml文件里的name对应
private String name;
2.2 Environment 读取方式
@Autowired
private Environment env; //和Value获取比较只需要注入一次,就可以获取所以数据
2.3 ConfigurationProperties 读取方式
@Autowired
private personModel person;
@Component
//添加Component表示的意思 personModel被spring所识别,它是一个bin
//@ConfigurationProperties //不指定节点对象则是全部,它会根据类里面的属性名称去寻找配置文件的名称逐一对应
@ConfigurationProperties(prefix = "person")
//这里指定了名称,它会根据指定的名称去寻找配置文件里的对象节点名称进行对应,
//注意:这里的名称一定要和配置文件里的对象名称一致
public class personModel {}
- 具体请看下文的
personModel.java 文件内容
三、完整实例配置文件以及运行结果
我的项目结构如下图
application.yml 文件内容
server:
port: 8081
name: abc
#对象
person:
name: zhangsan
age: 20
address:
- beijing
- shanghai
#对象行内写法
person2: {name: zhangsan,age: 20}
#数组
address:
- beijing
- shanghai
#数组行内写法
address2: [beijing,shanghai]
#纯量
msg1: 'hello \n world' #单引号忽略转义字符
msg2: "hello \n world" #双引号识别转义字符
#参数引用
nameval: xiaoming
personval:
name: ${nameval} #引用上边定义的nameval值
personModel.java 文件内容
package jjycheng.springbootwebdemo.springbootwebdemo.demos.web;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
//添加Component表示的意思 personModel被spring所识别,它是一个bin
//@ConfigurationProperties //不指定节点对象则是全部,它会根据类里面的属性名称去寻找配置文件的名称逐一对应
@ConfigurationProperties(prefix = "person")
//这里指定了名称,它会根据指定的名称去寻找配置文件里的对象节点名称进行对应,
//注意:这里的名称一定要和配置文件里的对象名称一致
public class personModel {
private String name;
private int age;
private String[] address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String[] getAddress() {
return address;
}
public void setAddress(String[] address) {
this.address = address;
}
@Override
public String toString() {
return "personModel{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
YamlTestController.java 文件内容
package jjycheng.springbootwebdemo.springbootwebdemo.demos.web;
import com.sun.org.apache.xpath.internal.objects.XString;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
@RequestMapping("/yml")
@Controller
public class YamlTestController {
/*---------------【Value注解方式】--------------------*/
@Value("${name}") //${name}里的name要和.yml文件里的name对应
private String name;
@Value("${person.name}")
private String personName;
// 参数引用
@Value("${personval.name}")
private String personvalName;
// 数组
@Value("${address[0]}")
private String address0;
// 纯量
@Value("${msg1}")
private String msg1;
@Value("${msg2}")
private String msg2;
/*---------------【对象注入】--------------------*/
@Autowired
private Environment env; //和Value获取比较只需要注入一次,就可以获取所以数据
/*---------------【ConfigurationProperties对象和配置属性的绑定】--------------------*/
@Autowired
private personModel person;
@RequestMapping("/get")
@ResponseBody
public String get() {
//控制台输出
System.out.println("-------【Value引入】----------");
System.out.println("name="+name);
System.out.println("personName="+personName);
System.out.println("personvalName="+personvalName);
System.out.println("address0="+address0);
System.out.println("msg1="+msg1);
System.out.println("msg2="+msg2);
System.out.println("-------【对象引入】----------");
System.out.println("env_name="+env.getProperty("name"));
System.out.println("env_personName="+env.getProperty("person.name"));
System.out.println("env_personvalName="+env.getProperty("personval.name"));
System.out.println("env_address0="+env.getProperty("address[0]"));
System.out.println("env_msg1="+env.getProperty("msg1"));
System.out.println("env_msg2="+env.getProperty("msg2"));
System.out.println("-------【ConfigurationProperties】----------");
System.out.println("person.name="+person);
for (String item: person.getAddress())
{
System.out.println("person.Addressitem="+item);
}
//结果输出(页面输出)
String res= "<br/><h1 style=\"color:red;\">-------【Value引入】----------</h1>"+
"<br/><b>name="+name+"</b>"+
"<br/><b>personName="+personName+"</b>"+
"<br/><b>personvalName="+personvalName+"</b>"+
"<br/><b>address0="+address0+"</b>"+
"<br/><b>msg1="+msg1+"</b>"+
"<br/><b>msg2="+msg2+"</b>"+
"<br/><h1 style=\"color:red;\">-------【对象引入】----------</h1>"+
"<br/><b>env_name="+env.getProperty("name")+"</b>"+
"<br/><b>env_personName="+env.getProperty("person.name")+"</b>"+
"<br/><b>env_personvalName="+env.getProperty("personval.name")+"</b>"+
"<br/><b>env_address0="+env.getProperty("address[0]")+"</b>"+
"<br/><b>env_msg1="+env.getProperty("msg1")+"</b>"+
"<br/><b>env_msg2="+env.getProperty("msg2")+"</b>"+
"<br/><h1 style=\"color:red;\">-------【ConfigurationProperties】----------</h1>"+
"<br/><b>person="+person+"</b>"+
"";
for (String item: person.getAddress())
{
res+="<br/><b>person.Addressitem="+item+"</b>";
}
return res;
}
}
运行结果
控制台结果
-------【Value引入】----------
name=abc
personName=zhangsan
personvalName=xiaoming
address0=beijing
msg1=hello \n world
msg2=hello
world
-------【对象引入】----------
env_name=abc
env_personName=zhangsan
env_personvalName=xiaoming
env_address0=beijing
env_msg1=hello \n world
env_msg2=hello
world
-------【ConfigurationProperties】----------
person.name=personModel{name='zhangsan', age=20}
person.Addressitem=beijing
person.Addressitem=shanghai
控制台截图
转义字符
重点
#纯量
msg1: 'hello \n world' #单引号忽略转义字符
msg2: "hello \n world" #双引号识别转义字符
网页结果
-------【Value引入】----------
name=abc
personName=zhangsan
personvalName=xiaoming
address0=beijing
msg1=hello \n world
msg2=hello world
-------【对象引入】----------
env_name=abc
env_personName=zhangsan
env_personvalName=xiaoming
env_address0=beijing
env_msg1=hello \n world
env_msg2=hello world
-------【ConfigurationProperties】----------
person=personModel{name='zhangsan', age=20}
person.Addressitem=beijing
person.Addressitem=shanghai
下面搜网页截图