SpringBoot篇——一篇文章彻底玩转yaml,搞清yaml特性!

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的技术点,敬请期待!

  • 16
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Be explorer

若认可笔者文章,手头富裕望支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值