YAML 简介
Spring Boot 使用一个全局配置文件来对一些默认配置值进行修改,比如Tomcat端口等
配置文件名字约定为“application.properties”或者“application.yml”
配置文件放必须放在src/main/resources目录或者类路径/config下
yml 全称 YAML(YAML Ain't Markup Language),以数据为中心,比 json、xml 等更适合做配置文件
语法规范参考网址:http://www.yaml.org
如下所示使用"application.yml"来修改内置的Tomcat的端口
YAML 语法
- k:(空格)v:表示一对键值对,注意必须有空格;
- 使用缩进表示层级关系,缩进时不允许使用Tab键,只允许使用空格。
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
- 大小写敏感
server:
port: 8082
数据类型
YAML 支持三种数据结构
对象:键值对的集合,常用写法
数组:一组按次序排列的值
字面量:单个的、不可再分的值
复合结构,以上三种写法的任意组合都可以
对象( Map )
{k: v}:在下一行来写对象的属性和值的关系;注意缩进
冒号后面跟空格来分开键值;如下frined表示对象,latName与age表示属性
friend:
lastName: zhangsan
age: 20
- {k: v}是行内写法,如下frined表示对象,latName与age表示属性
friend: {lastName: zhangsan,age: 18}
字面量
k: v:字面亮直接写,值(v)可以是“数字”、“字符串”、“布尔”、“日期”
字符串默认不使用单引号或者双引号
""(双引号)不会转义字符串里面的特殊字符,特殊字符会作为本身想表示的意思,,如:name: "zhangsan \n lisi":输出的结果是:zhangsan 换行 lisi
''(单引号)会转义字符串中的特殊字符,特殊字符最终只是一个普通的字符串数据,如:name: ‘zhangsan \n lisi’:输出结果为:zhangsan \n lisi
数组(List、Set)
“- 值”表示数组中的一个元素,注意缩进 和空格
Animal:
‐ cat
‐ dog
‐ pig
- 行内写法
Animal: [cat,dog,pig]
YAML 文件 值注入
- 可以将 "application.yml" 配置文件中的键-值自动映射注入Java Bean中
- 这个例子接着《Spring Initializer 快速创建 Spring Boot 项目》中的应用开始写
Java Bean
/**
* 狗 实体类-----------普通Java Bean
*/
public class Dog {
private Integer id;
private String name;
private Integer age;
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Dog{" +
"age=" + age +
", id=" + id +
", name='" + name + '\'' +
'}';
}
}
/**
* 用户···实体
*
* @ConfigurationProperties 表示 告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;
* prefix = "user" 表示 将配置文件中key为user的下面所有的属性与本类属性进行一一映射注入值,如果配置文件中
* 不存在"user"的key,则不会为POJO注入值,属性值仍然为默认值
* <p/>
* @ConfigurationProperties (prefix = "user") 默认从全局配置文件中获取值然后进行注入
* @Component 将本来标识为一个Spring 组件,因为只有是容器中的组件,容器才会为@ConfigurationProperties提供此注入功能
*/
@Component
@ConfigurationProperties(prefix = "user")
public class User {
private Integer id;
private String name;
private Integer age;
private Date birthday;
private List<String> colorList;
private Map<String, String> cityMap;
private Dog dog;
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Map<String, String> getCityMap() {
return cityMap;
}
public void setCityMap(Map<String, String> cityMap) {
this.cityMap = cityMap;
}
public List<String> getColorList() {
return colorList;
}
public void setColorList(List<String> colorList) {
this.colorList = colorList;
}
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"age=" + age +
", id=" + id +
", name='" + name + '\'' +
", birthday=" + birthday +
", colorList=" + colorList +
", cityMap=" + cityMap +
", dog=" + dog +
'}';
}
}
写了上面的“@ConfigurationProperties(prefix = "user")”注解后,如下会提示“Spring Boot配置文件注解处理器没有找到”,这时可以点击右上角的提示“Opne Documention...”进入官方文档拷贝依赖放入到"pom.xml"文件中即可。
- 拷贝的就是如下所示,粘贴之后刷新Maven依赖就下载好了,此时以后写yaml文件时就会有提示了,会方便很多。
<!--导入配置文件处理器,配置文件属性值与Java Bean进行绑定时就会有提示-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
application. yml
文件内容如下,key值user要与User实体类上的"@ConfigurationProperties(prefix = "user")"对应
配置文件属性名要与实体类User中的一致
yml文件编写时要注意缩进只能是空格,且key:与value必须要用空格隔开
下面基本涵盖了YAML所有的数据类型
server:
port: 8081
user:
id: 110
lastName: 张三
age: 110
birthday: 2018/07/11
colorList:
- red
- yellow
- green
cityMap: {mapK1: mapV1,mapK2: mapV2}
dog:
id: 9527
name: 哮天犬
age: 100
测试类 运行测试
/**
* SpringBoot单元测试
* 可以在测试期间很方便的类似编码一样进行自动注入等容器的功能
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class HelloWorldQuickApplicationTests {
/**
* 因为User类使用了@Component注解,就是Spring一个组件,交由了Spring容器注入值
* 所以使用@Autowired或者@Resource,DI注入在取值即可
*/
@Resource
private User user;
@Test
public void contextLoads() {
System.out.println("------------------------------********************--------------------------------------------");
System.out.println("======================" + user);
}
}
- 运行上面的测试类之后,就会看到如下输出,配置文件注入值成功
- 注意当User的"lastName"改为"name"时,注入的时候会自动变成"Administrator",而导致自己的值无法注入,可能name是关键字吧
application. properties 文件
Spring Boot 约定“application.properties”与“application.yml”都是作为默认的配置文件,放在src/main/resources目录或者类路径/config下
“application.properties”与“application.yml” 功能完全一样,只是写法上略有不同。
properties 文件注入值
现在仍然以上面的需求为例,为User实体注入值,使用application.properties来配置
写法很类似Json的取值写法,都是以"."来递进的
server.port=8081
user.id=111
user.lastName=张无忌
user.age=120
user.birthday=2018/07/11
user.colorList=red,yellow,green,blacnk
user.cityMap.mapK1=mapV1
user.cityMap.mapK2=mapV2
user.dog.id=7523
user.dog.name=狗不理
user.dog.age=3
- 对应的yml写法如下:
server:
port: 8081
user:
id: 110
lastName: 张三
age: 110
birthday: 2018/07/11
colorList:
- red
- yellow
- green
cityMap: {mapK1: mapV1,mapK2: mapV2}
dog:
id: 9527
name: 哮天犬
age: 100
乱码处理
- *.properties文件中含有中文时,IDEA设置的UTF-8仍然会乱码,需要勾选后面的"本地编码转为ASCII码"即可解决
- 注意"File Encodings"设置完成后,如果.properties文件中之前已经存在中文了,则需要删除重写