强的可怕的Yaml

在这里插入图片描述

🏆 作者简介:hh_hua,从0到1。
🏆《头衔》:CDSN优秀文章收藏者、CSDN从不评论者
🏆《近期荣誉》:妈妈说我是个好孩子
🏆《博客内容》:从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,不要犹豫!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值