一、yaml语法
1.1、什么是yaml
YAML是一个类似 XML、JSON 的标记性语言。YAML 强调以数据为中心,并不是以标识语言为重点。因而 YAML 本身的定义比较简单,号称“一种人性化的数据格式语言”。具有 XML 同样的优点,但比 XML 更加简单、敏捷等。
1.2、编写规范
1.2.1、基本数据类型(字面量):int、string、boolean等
people:
name: 张三
age: 24
isTeacher: true
1、使用缩进表示层级关系,同一级别元素左侧对齐,缩进只能使用空格键不能使用Tab键;
2、属性名与属性值之间必须以“空格”进行分隔,否则无效;
3、属性名和属性取值均大小写敏感;
4、属性值赋值:
"":双引号;不会转义字符串里面的特殊字符,特殊字符会做为本身想表达的意思输出
如:"张三 \n lisi" ;输出:张三 换行以后 lisi;
‘’:单引号;会转义字符串里面的特殊字符,如果使用的是单引号则上述数据输出为:张三 \n lisi
1.2.2、Map对象
1、方式一:
maps: {k1: obj1,
k2: obj2}
2、方式二:
maps:
k1: obj1
k2: obj2
1.2.3、数组(List、Set)
1、方式一:
list:
- lisi
- zhangsan
- mark
2、方式二:
list: [lisi,zhangsan,mark]
1.2.4、自定义实例对象Dog(name,age)
1、方式一:
dog:
name: 二哈
age: 2
2、方式二:
dog: { name: 二哈,
age: 2}
注意:对象的配置方式与map一模一样。
1.3、springboot默认配置文件
springboot默认使用application.properties或者application.yaml文件作为springboot的默认启动文件
1、properties文件自定义实体属性格式
userinfo.account=itdragonBlog
userinfo.age=25
userinfo.active=true
userinfo.created-date=2018/03/31 16:54:30
userinfo.map.k1=v1
userinfo.map.k2=v2
userinfo.list=one,two,three
userinfo.position.name=Java架构师
userinfo.position.salary=19999.99
2、yaml格式文件自定义实体属性配置
people:
name: 张三
age: 24
isTeacher: true
maps:
k1: obj1
k2: obj2
list:
- lisi
- zhangsan
- mark
dog:
name: 二哈
age: 2
last-name: zhangsan
二、springboot读取配置文件的两种方式
2.1、@ConfigurationProperties注解读取配置文件
1、实体类建立
People实体类
@Component
@ConfigurationProperties(prefix = "people")
public class People {
private String name;
private int age;
private boolean isTeacher;
private Map maps;
private List list;
private Dog dog;
private String lastName;
Dog实体类
public class Dog {
private String name;
private int age;
2、在people实体类前面加入@ConfigurationProperties标签
@ConfigurationProperties:告诉springboot将本类中所有的属性与配置文件中的配置进行绑定,prefix的值就是声明配置文件中该值下的子属性与实体类属性进行一对一的映射
3、controller类
@RestController
public class PeopleController {
@Autowired
People people;
@RequestMapping("/people")
public People getPeople(){
return people;
}
4、添加配置文件处理器:配置提示功能
org.springframework.boot
spring-boot-configuration-processor
true
5、测试结果
{"name":"张三","age":24,"maps":{"k1":"obj1","k2":"obj2"},"list":["lisi","zhangsan","mark"],"dog":{"name":"二哈","age":2},"lastName":"zhangsan","teacher":true}
2.2、使用@value标签
1、person实体
public class People {
//@value("${}")只能注入基本数据类型:string,int,Boolean
@Value("${people.name}")
private String name;
// @Value("#{24}")
@Value("${people.age}")
private int age;
// @Value("#{true}")
@Value("${people.isTeacher}")
private boolean isTeacher;
private Map maps;
private List list;
private Dog dog;
// @Value("#{'zhangsan'}")
@Value("${people.last-name}")
private String lastName;
2、测试结果
{"name":"张三","age":24,"maps":null,"list":null,"dog":null,"lastName":"zhangsan","teacher":true}
3、@value(${})只能获取字面值,bean、map、List可以使用@value(#{}) SpEL表达式实现,具体可以参考
https://blog.csdn.net/ya_1249463314/article/details/68484422
2.3、@ConfigurationProperties与@value的对比
@ConfigurationProperties | @value | |
---|---|---|
功能 | 批量注入配置文件的属性 | 一个个指定 |
松散绑定(松散语法) | 支持 | 不支持 |
SpEL表达式 | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装(如Map) | 支持 | 不支持 |
业务场景:
1、我们如果只需要获取实体中某一项属性值,推荐使用@value
2、需要实现javaBean与配置文件的一对一映射,推荐使用@ConfigurationProperties
2.4、@ConfigurationProperties使用JSR303数据校验
1、people实体类
@Component
@ConfigurationProperties(prefix = "people")
@Validated
public class People {
@Email
private String name;
private int age;
private boolean isTeacher;
private Map maps;
private List list;
private Dog dog;
private String lastName;
2、测试报错
Binding to target org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'people' to com.example.demo.entity.People failed:
Property: people.name
Value: 张三
Origin: class path resource [application.yaml]:2:11
Reason: 不是一个合法的电子邮件地址
证明JSR303数据校验绑定成功。
2.5、松散绑定@value测试
1、yaml文件配置
last-name: zhangsan
2、people实体类中引用
@Value("${lastName}")
private String lastName;
3、测试结果报错
Could not resolve placeholder 'lastName' in value "${lastName}"
证明了@value标签不支持松散绑定,但是@ConfigurationProperties支持这样的松散绑定
4、注意:当application.properties与application.yaml同时存在时,application.properties的优先级要大于application.yaml并形成互补配置。