yaml语法
一、定义
yaml是一种标记语言,通俗的讲现在在SpringBoot开发当中,几乎都在使用yaml,下面是对比xml配置,明显看出yaml的清晰简洁
1、基础语法
二、在实际开发中yaml能存什么类型的值
我是对比properties配置文件
三、其他语法拓展
(一)使用占位符,动态修改配置文件中的值
1、配置代码
person:
# 获取随机的id
name: ${random.uuid}
# 获取随机的int值
age: ${random.int}
happy: true
birth: 2023/03/01
map: {k1: 123,k2: 222}
list:
- 黄鹂
- 鹦鹉
- 杜鹃
dog:
# 这里的意思是判断person下的hello有没有对应的值,如果有,则取hello中的;如果没有,则取小黄
name: ${person.hello:小黄}_旺财
age: 6
2、实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component//注册实体类,让Spring接管
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private Integer age;
private boolean happy;
private Date birth;
private Map<String,Object> map;
private List<Object> list;
private Dog dog;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component//注册实体类,让Spring接管
public class Dog {
private String name;
private Integer age;
}
3、控制台读取效果
Person(name=eddfc7b2-2a42-4879-8571-2b2edf6f155b, age=2081834320, happy=true, birth=Wed Mar 01 00:00:00 CST 2023, map={k1=123, k2=222}, list=[黄鹂, 鹦鹉, 杜鹃], dog=Dog(name=小黄_旺财, age=6))
yaml给属性赋值方式
见实例
一、创建两个实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component//注册实体类,让Spring接管
public class Dog {
@Value("旺财")
private String name;
@Value("12")
private Integer age;
}
含对@ConfigurationProperties的介绍
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component//注册实体类,让Spring接管
/*@ConfigurationProperties作用:
* 将配置文件中配置的每一个属性的值,映射到这个组件中
* 告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
* 参数prefix = "person":表示将配置文件中的person下面的所有属性一一对应
* 使用这个注解的前提是这个组件是容器中的组件,用@Component注册Bean
* */
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private Integer age;
private boolean happy;
private Date birth;
private Map<String,Object> map;
private List<Object> list;
private Dog dog;
}
二、编写application.yaml配置文件,给Person实体类属性赋值
person:
name: 张三
age: 15
happy: true
birth: 2023/03/01
map: {k1: 123,k2: 222}
list:
- 黄鹂
- 鹦鹉
- 杜鹃
dog:
name: 旺财
age: 6
三、测试
@SpringBootTest
class Springboot02ConfigApplicationTests {
//将实体类自动装配,之前我们给实体类属性赋值后,经过此注解就可以将值装配进来
//使用@Autowired注解前提是实体类要用@Component注解标记实体类为一个组件,被Spring接管,否则就会报错
@Autowired
private Person person;
@Test
void contextLoads() {
System.out.println(person);
}
}
四、总结
用application.yaml配置文件给属性赋值,需要使用到注解@ConfigurationProperties,并且把需要关联的内容放进注解中,还要注意想要在测试类中通过自动装配将实体类引进来,前提是这个实体类一开始就使用了@Component注解被Spring托管
yaml特性
支持松散绑定
所谓松散绑定就是我们在yaml配置文件中可以对属性使用-来命名,能和实体类中的驼峰命名的属性一一对应
比如我们yaml中写的last-name,它和实体类中的lastName一样,“-”后面的字母默认是大写的
实例:
一、配置yaml配置文件
dog:
last-name: 旺财plus
age: 88
二、实体类
实体类要使用@Configurationproperties注解绑定对象
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component//注册实体类,让Spring接管
@ConfigurationProperties(prefix = "dog")
public class Dog {
private String lastName;
private Integer age;
}
三、测试
@SpringBootTest
class Springboot02ConfigApplicationTests {
//将实体类自动装配,之前我们给实体类属性赋值后,经过此注解就可以将值装配进来
//使用@Autowired注解前提是实体类要用@Component注解标记实体类为一个组件,被Spring接管,否则就会报错
@Autowired
private Dog dog;
@Test
void contextLoads() {
System.out.println(dog);
}
}
四、控制台
五、总结
这个方式我理解就是使得配置文件更加清晰,并且侧面反映了yaml配置文件的灵活性
支持JSR303数据校验
常见的数据校验注解
使用方法:
一、首先先编写yaml配置文件
person:
# 获取随机的id
name: ${random.uuid}
# 获取随机的int值
age: ${random.int}
happy: true
birth: 2023/03/01
email: 12121
map: {k1: 123,k2: 222}
list:
- 黄鹂
- 鹦鹉
- 杜鹃
dog:
# 这里的意思是判断person下的hello有没有对应的值,如果有,则取hello中的;如果没有,则取小黄
name: ${person.hello:小黄}_旺财
age: 6
二、编写实体类,需要在类上加一个数据校验注解@Validated
注意使用这个注解的时候,如果下面的某个注解爆红,则去pom.xml配置文件中导入数据校验的启动器
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component//注册实体类,让Spring接管
@ConfigurationProperties(prefix = "person")
//数据校验注解
@Validated
public class Person {
private String name;
private Integer age;
private boolean happy;
private Date birth;
@Email(message = "输入的Email不符合规范!")
private String email;
private Map<String,Object> map;
private List<Object> list;
private Dog dog;
}
三、测试
@SpringBootTest
class Springboot02ConfigApplicationTests {
//将实体类自动装配,之前我们给实体类属性赋值后,经过此注解就可以将值装配进来
//使用@Autowired注解前提是实体类要用@Component注解标记实体类为一个组件,被Spring接管,否则就会报错
@Autowired
private Person person;
@Test
void contextLoads() {
System.out.println(person);
}
}
四、控制台
控制台报错,提示信息如下
拓展:通过注解,加载指定的配置文件
有些时候,我们不想光使用yaml配置文件,也想使用properties读取配置文件,这里就涉及到另一个注解来将实体类和配置文件绑定
实例:
一、编写一个实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component//注册实体类,让Spring接管
@PropertySource(value = "classpath:zz.properties")//绑定配置文件
public class Dog {
//绑定配置文件后,可以使用Spring的el表达式将文件中的值取出来赋值给属性
@Value("${name}")
private String name;
@Value("${age}")
private Integer age;
}
二、编写配置文件
name=旺财
age=99
三、测试
@SpringBootTest
class Springboot02ConfigApplicationTests {
//将实体类自动装配,之前我们给实体类属性赋值后,经过此注解就可以将值装配进来
//使用@Autowired注解前提是实体类要用@Component注解标记实体类为一个组件,被Spring接管,否则就会报错
@Autowired
private Dog dog;
@Test
void contextLoads() {
System.out.println(dog);
}
}
四、控制台打印结果
五、总结
这种方式比较万能,但是我们还是推荐使用yaml配置文件的方式,因为yaml更加智能
至此,你已经深入的掌握了关于yaml的技术点,开发中可以直接使用yaml配置或者将老的properties文件改造成yaml文件。后续还会持续更新关于SpringBoot的技术点,敬请期待!