SpringBoot-04-YAML配置绑定

YAML

配置文件

SpringBoot使用一个全局的配置文件,配置文件名称是固定的

  • application.properties
    语法结构: key=value
    key和value都要为字符串类型
  • application.yaml
    语法结构: key:空格 value
    key为字符串类型,value可以为任意数据类型

配置文件的作用: 修改SpringBoot自动配置的默认值,因为SpringBoot在底层都给我们自动配置好了


YAML概述

	YAML是“YAML Ain't a Markup Language”(YAML不是一种标记语言)的递归缩写。
	
	在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语言)

这种语言是以数据作为中心,而不是以标记语言作为中心。

yaml比xml和json更适合作为配置文件,想要使用


YAML语法

YAML语法如下:

  • 空格不能省略
  • 以缩进来控制层级关系,只要是左边对齐的一列数据就是同层级的关系
  • 属性和值的大小写是十分敏感的

YAML常用写法

YAML支持以下三种数据结构

  • 对象:键值对的集合
  • 数组:一组按次序排列的值
  • 字面值:单个的、不可拆分的值
  1. 字面值:普通的值[数字,布尔值,字符串]
		k: 2

注意

		“ ” 双引号,不会转义字符串里面的特殊字符 , 特殊字符会作为本身想表示的意思;
		
		比如 :name: "kuang \n shen"   输出 :kuang  换行   shen
		
		'' 单引号,会转义特殊字符 , 特殊字符最终会变成和普通字符一样输出
		
		比如 :name: ‘kuang \n shen’   输出 :kuang  \n   shen
  1. 对象、Map(键值对)
	普通写法
	student:
	    name: liang
	    age: 12
	
	
	行内写法
	student1: {name: zh,age: 2}
  1. 数组(List,set)
    用 - 值表示数组中的一个元素,
	pets:
	  - Dog
	  - cat
	  - pig
	
	#行内写法
	pets1: [Dog,cat,pig]

4.复合结构

person:
   name: liang${random.uuid}     #随机生成唯一通用符
   age: ${random.int(1,150)}
   date: 2001/4/10
   isStudent: true
   maps: {hobby: "睡觉",nature: "温和"}
   lists: [code,music]
   dog:
      name: 旺财
      age: 3

5.YAML组织结构

一个YAML文件可以由一个或多个文档组成,文档之间使用“—”作为分隔符,且各文档组成独立,互不干扰。

---
website:
  name: bianchengbang
  url: www.biancheng.net
---
website: {name: bianchengbang,url: www.biancheng.net}
pets:
  -dog
  -cat
  -pig
---
pets: [dog,cat,pig]
name: "zhangsan \n lisi"
---
name: 'zhangsan \n lisi

注入配置文件

方式一:properties方式

  1. 在springboot项目中的resources目录下新建一个文件application.yaml
		user1.name=chao
		user1.age=3
		user1.sex=男
  1. 编写一个实体类Dog
package com.liang.pojo;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

@Component
@PropertySource("classpath:user.properties")
public class User {

    @Value("${user1.name}")      //从配置文件中取值
    private String name;
    @Value("#{9*2}")            //#{SPEL} SpringEL表达式
    private Integer age;
    @Value("男")                //字面值
    private String sex;

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
}

@PropertiesResource(“classpath:对应配置文件”)
加载指定的配置文件
3. 通过@Value给每个属性赋值

通过配置文件取值和SpringEL表达式、字母值给属性赋值

  1. 通过springboot的测试类来测试注入
import com.liang.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class Springboot02EstablishApplicationTests {

    //自动装配
    @Autowired
    private User user;
    @Test
    void contextLoads() {
        System.out.println(user);;
    }
}

结果:

在这里插入图片描述


方式二:yaml方式

  1. 编写一个复杂的实现类:Person类

@Component
public class Person {

    private String name;
    private Integer age;
    private Date date;
    private Boolean isStudent;      //属性的名称正规一点
    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;
	
	getter,setter方法,构造方法,toString方法
}

  1. 编写yaml配置文件
person:
   name: liang${random.uuid}     #随机生成唯一通用符
   age: ${random.int(1,150)}
   date: 2001/4/10
   isStudent: true
   maps: {hobby: "睡觉",nature: "温和"}
   lists: [code,music]
   dog:
      name: 旺财
      age: 3
  1. 给类中属性赋值
@Component      //注册Bean到容器中
@ConfigurationProperties(prefix="person")
public class Person {

    private String name;
    private Integer age;
    private Date date;
    private Boolean isStudent;      //属性的名称正规一点
    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;
	
	getter,setter方法,构造方法,toString方法
}

@Configuration的作用是将配置文件的每一个属性,映射到这个组件
告诉SpringBoot将本类的所有属性和配置文件相关的配置进行绑定
参数prefix=“person”,将配置文件person下面的所有属性和定义的类一一对应

  1. 发现IDEA提示,springboot配置处理器未找到,导入一个依赖

<!-- 导入配置文件处理器,配置文件进行绑定就会有提示,需要重启 -->
	<dependency>
	  <groupId>org.springframework.boot</groupId>
	  <artifactId>spring-boot-configuration-processor</artifactId>
	  <optional>true</optional>
	</dependency>
  1. 测试

指定配置文件绑定成功!
在这里插入图片描述

配置文件占位符


person:
    name: Liang${random.uuid} # 随机uuid
    age: ${random.int}  # 随机int
    happy: false
    birth: 2000/01/01
    maps: {k1: v1,k2: v2}
    lists:
      - code
      - girl
      - music
    dog:
      name: ${person.hello:other}_旺财
      age: 1

回顾properties配置

通过上面的对比,我们知道了yaml格式的好处,开发中也是常用的,也是springboot推荐使用的。properties给属性赋值时,要对每一个属性单独赋值,显得不灵活,而且properties在写中文的时候,会有乱码,我们需要在IDEA设置编码格式为UTF-8;settings-FileEncodings中配置
在这里插入图片描述


对比小结

@Value不太友好,需要给每个属性单独注解赋值
在这里插入图片描述

  1. @ConfigurationProperties只需要写一次,@Value需要每个字段添加
  2. 松散绑定,像在yaml文件中我们写成last-name,而我们的实体类写的是lastName,是能够完成绑定属性值的。
  3. JSR303数据校验,这个是在字段中增加一层过滤器验证,保证数据的合法性。
  4. 复杂类型封装,yaml可以封装对象,使用value就不支持。

结论

配置yml和配置properties都可以获取到值 , 强烈推荐 yml;

如果我们在某个业务中,只需要获取配置文件中的某个值,可以使用一下 @value;

如果说,我们专门编写了一个JavaBean来和配置文件进行一一映射,就直接@configurationProperties

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值