🏆 作者简介:hh_hua,从0到1。
🏆《头衔》:CDSN优秀文章收藏者、优快云从不评论者
🏆《近期荣誉》:妈妈说我是个好孩子
🏆《博客内容》:从nothing到everything
🏆🎉欢迎 👍点赞✍评论⭐收藏
文章目录
🚀什么是yaml?
yaml官方说🧑,如下图:
翻译:YAML不是一种标记语言,是一种人类可读的完整的数据序列化语言。(说的很好,但我不听。🙉)
我的理解:换汤不换药,它仍是一种语言,以数据为中心,而不是以标记为重点的语言,至于什么语言不那么重要。(名可名,非常名)
🚀为何要使用yaml?
因为它强的可怕,它是spring boot的宠儿,它简单而优雅,冰山一角如下所示。
传统的xml配置
<server>
<port>8081<port>
</server>
yaml配置
server:
prot: 8081
正经话:yaml配置相较于xml配置,功能强大且简单。
🚀yaml语法
🔎yaml格式
- 以xxx.yaml命名文件,例如appplication.yaml
- 书写格式: key:value
注意事项:冒号后面要加一个空格,其中value可以是[ 数字,布尔值,字符串 ]
🔎yaml的基本语法
- 空格不能省略,不允许使用tab,只允许空格
- 以缩进来控制层级关系,缩进的空格数不重要,只要是左边对齐的一列数据都是同一个层级的
- 属性和值的大小写都是十分敏感的
- '#'表示注释
🔎yaml的数据类型
对象、Map(键值对)
#对象、Map格式
k:
v1:
v2:
实例:对象sutdent,属性值name、age
#写法一
student:
name: hhhua
age: 3
#写法二
student: {name: hhhua,age: 3}
数组( List、set )
用 - 值表示数组中的一个元素
#写法一
pets:
- cat
- dog
- pig
#写法二
pets: [cat,dog,pig]
🚀展示yaml的强大
以前:我们通过@Value给bean注入属性值。
@Component //注册bean到容器中
public class Person {
@Value("${app.name}")
private String name;
@Value("${app.age}")
private Integer age;
@Value("${app.featureEnabled:true}")// 使用默认值true
private Boolean happy;
@Value("#{${app.mapItems}}")
private Map<String,Object> maps;
@Value("#{${app.listItems}}")
private List<Object> lists;
@Autowired
private Dog dog;
//有参无参构造、get、set方法、toString()方法
}
在application.properties
中(注意Map的键值对格式):
# application.properties
app.name=hhhua
app.age=3
app.featureEnabled=false
app.mapItems={k1:v1,k2:v2}
app.listItems=code,girl,music
现在:用yaml配置的方式进行注入,通过@ConfigurationProperties来配合
/*
@ConfigurationProperties作用:
将配置文件中配置的每一个属性的值,映射到这个组件中;
告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
参数 prefix = “person” : 将配置文件中的person下面的所有属性一一对应
*/
@Component //注册bean
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private Integer age;
private Boolean happy;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
}
在application.yaml
中:
person:
name: qinjiang
age: 3
happy: false
maps: {k1: v1,k2: v2}
lists:
- code
- girl
- music
dog:
name: 旺财
age: 1
总结:@Value使用起来并不友好!我们需要为每个属性单独注解赋值,比较麻烦,而yaml文件可以给我们的实体类直接注入匹配值!
注意事项: 导入配置文件处理器,配置文件进行绑定就会有提示,需要重启
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
yaml的强大不仅于此,yaml还可以配置文件占位符,通过 ${}
person:
name: qinjiang${random.uuid} # 随机uuid
age: ${random.int} # 随机int
happy: false
birth: 2000/01/01
maps: {k1: v1,k2: v2}
lists:
- code
- girl
- music
dog:
# 引用person.hello 的值,如果不存在就用 :后面的值,即 other,然后拼接上_旺财
name: ${person.hello:other}_旺财
age: 1
另外:properties配置文件在写中文的时候,会有乱码 , 我们需要去IDEA中设置编码格式为UTF-8
🚀@ConfigurationProperties注解 VS @Value注解
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 批量注入配置文件中的属性 | 一个个指定 |
松散语法 | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复制类型封装 | 支持 | 不支持 |
- @ConfigurationProperties只需要写一次即可 , @Value则需要每个字段都添加
- 松散绑定:yaml配置文件给实体类对象赋值是松散绑定的,即在yaml中的first-name可以赋值给实体类对象的firstName。
first-name 与 first-name可以对应
- 3JSR303数据校验 ,我们可以在字段是增加一层过滤器验证 , 可以保证数据的合法性
通过用@validated来校验数据
@Component //注册bean
@ConfigurationProperties(prefix = "person")
@Validated //数据校验
public class Person {
@Email(message="邮箱格式错误") //name必须是邮箱格式
private String name;
}
- 复杂类型封装,yml中可以封装对象 ,使用value就不支持
🚀小结
- 配置yml和配置properties都可以获取到值 , 强烈推荐 yaml;
- 如果我们在某个业务中,只需要获取配置文件中的某个值,可以使用一下 @value;
- 如果说,我们专门编写了一个JavaBean来和配置文件进行一一映射,就直@configurationProperties,不要犹豫!