本篇文章用于总结 YML 配置文件的使用,如果错误之处,请批评指正,希望观众老爷们多多支持!
1. 概述
YML 是什么?
- YML (YAML Aint’t a Martup Language) YAML 不是一种标记语言,通常以
.yml 为后缀的文件,是一种直观的能够被电脑识别的数据序列化格式,并且容易被人类阅读,容易和脚本语言交互的,可以与支持 YAML 库的编程语言所导入使用,一种专门用来写配置文件的语言。
YAML 试图用一种比 XML 更敏捷的方式,来完成 XML 所完成的任务。例如:
student:
name: yanghi
age: 15
<student>
<name>yanghi</name>
<age>15</age>
</student>
YML 优点
- YML 易于人们阅读
- 更加简洁明了
2. 语法
2.1. 预定
key: value 表示键值对关系,冒号后面必须有一个空格- 使用空格的缩进表示层级关系,空格数目不重要,只要是左对齐的一列数据,都是同一个层级的
- 大小写敏感
- 缩进时不允许使用 Tab 键,只允许使用空格
- Java 中对于驼峰命名法,可用原名或者
- 代替驼峰,如 Java 中的 lastName 属性,在 yml 中使用 lastName 或者 last-name 都可正确映射
2.2. 键值关系
1. 普通值(字面量)
key: value 字面量直接写
字符串默认不用加上单引号或者双引号:
- 字符串使用双引号
" " 包裹时,转义字符能够被解析 - 字符串使用单引号
' ' 包裹时,转义字符不能够被解析,如 name: hi \n yml , \n 被识别为字符串
2. 日期
日期值用 / 进行分隔
date: 2019/01/01
3. 对象(属性和值)、Map(键值对)
Map 和 对象的写法一样,因为 Map 中存储的对象是键值对的形式
多行写法:key:value
student:
name: yanghi
age: 15
单行写法:对象字面量 {key1: value1, key2: value2}
student: {name: yanghi, age: 15}
4. 数组、list、set
数组、list、set,存储的数据都是一个个值,所以它们的写法是相同的
多行写法:用 - 值连接数组中的一个元素
pets:
- dog
- pig
- cat
单行写法:数组的形式 [item1, item2, ...]
pets: [dog, pig, cat]
5. 对象、集合、普通值的嵌套
比如说一个数组中的值是一个对象,这个对象中的某个属性的属性值是一个集合
students:
- {name: yanghi, age: 18, hobby: [eat, music]}
- {name: zhangsan, age: 18, hobby: [eat, music]}
- {name: lisi, age: 18, hobby: [eat, music]}
我们只需要掌握对象、集合、普通值的写法,进行嵌套就可以掌握了。
2.3. 占位符赋值
占位符相当于一个提前定义的变量
应用场景:就是在进行 yml 配置时,有些变量的值是重复的,那么我们就可以使用占位符来代替,当修改占位符的值,其他所有的都会改变。
myPort: 8080
server:
port: ${myPort: 8888}
${myPort: 8888} 表示引用提供定义好的 myPort ,8888 表示设置的变量,没有赋值的时候的默认值。也可以不写默认值,相当于 ${myPort: }
3. SpringBoot 读取 YML
3.1. @Value 注解
@Value 注解只能读取简单类型的值(8种基本数据类型及其包装类,String、Date)
首先我们在 SpringBoot 项目根目录的 resources 文件夹下,创建 application.yml 这就是我们项目的配置文件。
在该文件中写入以下配置:
student:
name: yanghi
读取方式:在类的成员属性上加上 @Value("") 注解,"" 内填入值的路径:student.name ,就会读取的配置文件中的值,注入到对应的成员属性上了。
@RestController
public class TestController {
@Value('${student.name}')
private String name;
@RequestMapping("/test")
public String test(){
return name;
}
}
注意:使用了 @Value 注解的类,必须交由 Spring 容器进行管理,否则该注解会失效。
3.2. @ConfigurationProperties注解
通常我们读取 yml 配置文件的常用方式是 @ConfigurationProperties 注解,因为@Value 注解只能单个的读取配置文件中的值,而@ConfigurationProperties 注解可以直接读取我们的配置文件,并且可以直接把 YML 配置文件中的 key: value 键值对,映射到类中的成员属性中去。
使用
在application.yml 中书写以下配置
student:
name: yanghi
age: 15
hobby: [eat, music]
在项目根目录下,创建 Student 实体类,用于对应 yml 配置中的 student 对象。并在类上添加 @Component 、@ConfigurationProperties(perfix = "prefix") 注解。
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
@ConfigurationProperties(perfix = "student")
public class Student {
private String name;
private Integer age;
private List<String> hobby;
}
类上标注的注解解释:
@Data Lombok 注解 自动为类成员属性添加 getter setter 方法@AllArgsConstructor Lombok 注解 为类添加有参构造方法@NoArgsConstructor Lombok 注解 为类添加无参构造方法 使用了 @AllArgsConstructor 注解,一定要添加 @NoArgsConstructor 注解@Component 泛指各种组件,该注解表示的类,会交给 Spring 容器进行管理@ConfigurationProperties(prefix = "" ) 获取配置文件值,注入到类成员属性中,prefix 前缀,用于导入特定前缀下的属性。
从 Spring 容器中获取 Student 对象
@RestController
public class TestController {
@AutoWired
private Student student;
@RequestMapping("/test")
public String test(){
return student;
}
}
4. YML 和 properties 相互转换
SpringBoot 项目支持 YML 和 properties 两种配置文件格式
在实际项目开发中,有的同学喜欢用 YML 格式,有的同学喜欢用 properties 格式。
那么我们可以使用 YML 和 properties 格式转换工具,进行格式之间的相互转换: https://toyaml.com/index.html
5. 配置 YML 书写提示
在书写 YML 配置时,我们希望敲一些关键字,可以显示出完整的提示,如输入 port ,提示 server.port 。
我们只需要在 Maven 配置文件 pom.xml 中,添加注解处理器依赖即可。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
然后重新编译项目,就可以显示提示了。 
|