栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringBoot-04-YAML配置绑定

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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支持以下三种数据结构

对象:键值对的集合数组:一组按次序排列的值字面值:单个的、不可拆分的值

    字面值:普通的值[数字,布尔值,字符串]
		k: 2

注意

		“ ” 双引号,不会转义字符串里面的特殊字符 , 特殊字符会作为本身想表示的意思;
		
		比如 :name: "kuang n shen"   输出 :kuang  换行   shen
		
		'' 单引号,会转义特殊字符 , 特殊字符最终会变成和普通字符一样输出
		
		比如 :name: ‘kuang n shen’   输出 :kuang  n   shen
    对象、Map(键值对)
	普通写法
	student:
	    name: liang
	    age: 12
	
	
	行内写法
	student1: {name: zh,age: 2}
    数组(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方式

    在springboot项目中的resources目录下新建一个文件application.yaml
		user1.name=chao
		user1.age=3
		user1.sex=男
    编写一个实体类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表达式、字母值给属性赋值

    通过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方式

    编写一个复杂的实现类:Person类
@Component
public class Person {

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

 
    编写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
    给类中属性赋值
@Component      //注册Bean到容器中
@ConfigurationProperties(prefix="person")
public class Person {

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

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

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

	
	  org.springframework.boot
	  spring-boot-configuration-processor
	  true
	
    测试

指定配置文件绑定成功!

配置文件占位符
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不太友好,需要给每个属性单独注解赋值

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

结论

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

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

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

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号