springboot-yaml配置注入

1 配置文件

springboot使用一个全局的配置文件,我们可以通过修改配置文件来修改springboot底层自动配置的默认值,配置文件名必须是 application,但可以使用以下两种不同类型

1.1 application.properties

key=value

1.2 application.yaml

key: value

2 ymal基础语法

#注意下面空格的位置,yaml语法对空格的要求非常严格
#可以注入到我们的配置类中
#普通的key-value
name: sam
#对象
student:
  name: sam
  age: 3
#行内写法
teacher: {name: sam,age: 3}
#数组
pets:
  - cat
  - dog
#行内写法
animal: [cat,dog]

说明:

  1. 空格要求十分严格
  2. 属性和值的大小写十分敏感
  3. 以缩进的方式来控制层级关系,只要左边对齐的一列数据都是同一层级的

3 yaml注入配置文件

下面的操作目的是要给新创建的对象使用yaml配置的方式注入属性

3.1 创建一个springboot项目

参考:springboot-hello world

3.2 创建pojo层,并在pojo层中新建两个实体类

注意需要在类名上加上 @Component 注解

package com.lv.pojo;

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

@Component
public class Dog {
    @Value("来福")
    private String name;
    @Value("3")
    private Integer age;
    public Dog() {
    }
    public Dog(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
    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;
    }
    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
package com.lv.pojo;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.List;
import java.util.Map;

@Component
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;
    public Person() {
    }
    public Person(String name, Integer age, Boolean happy, Date birth, Map<String, Object> map, List<Object> list, Dog dog) {
        this.name = name;
        this.age = age;
        this.happy = happy;
        this.birth = birth;
        this.map = map;
        this.list = list;
        this.dog = dog;
    }
    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 Boolean getHappy() {
        return happy;
    }
    public void setHappy(Boolean happy) {
        this.happy = happy;
    }
    public Date getBirth() {
        return birth;
    }
    public void setBirth(Date birth) {
        this.birth = birth;
    }
    public Map<String, Object> getMap() {
        return map;
    }
    public void setMap(Map<String, Object> map) {
        this.map = map;
    }
    public List<Object> getList() {
        return list;
    }
    public void setList(List<Object> list) {
        this.list = list;
    }
    public Dog getDog() {
        return dog;
    }
    public void setDog(Dog dog) {
        this.dog = dog;
    }
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", happy=" + happy +
                ", birth=" + birth +
                ", map=" + map +
                ", list=" + list +
                ", dog=" + dog +
                '}';
    }
}

以上的两个实体类,Dog作为Person的一个属性,Person是我们要创建并注入属性的对象

3.3 在resources目录下新建一个文件 application.yaml

在application.yaml中写入我们需要注入的属性值,注意.这里key的值和对象的属性名必须一致,否则注入不进去,属性会为null

person:
  name: sam
  age: 5
  happy: false
  Date: 2022/02/28
  map: {k1: v1,k2: v2}
  list:
    - code
    - music
    - girl
  dog:
    name: dog
    age: 3

3.4 在要注入的实体类Person的类名上加上如下注解

这个注解是本次操作的核心,它能够将配置文件中的每一个属性的值,映射到这个组件当中.告诉springboot将本类中所有属性和配置文件中相关的配置进行绑定,参数 prefix = "person" : 将配置文件中的person下面的属性一一对应,只用这个组件时容器的组件,才能够使用容器提供的ConfigurationProperties功能.

@ConfigurationProperties(prefix = "person")

3.5 编写springboot自带的测试类

package com.lv;

import com.lv.pojo.Person;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class Springboot02ConfigApplicationTests {
    @Autowired
    private Person dog;
    @Test
    void contextLoads() {
        System.out.println(dog);
    }
}

3.6 启动测试类并查看控制台结果

结果:所有值都注入成功

4 使用properties文件注入属性

@PropertySource(value = "") : 加载指定的配置文件,需要在参数中指定

@ConfigurationProperties : 加载默认的全局配置文件,也就是文件名必须是application的文件

下面采用指定配置文件测试

4.1 在resources目录下新建一个pro.properties文件

name=碳治郎

4.2 修改Person实体类

删除之前的@ConfigurationProperties注解

在实体类Person的类名上添加如下注解

@PropertySource(value = "classpath:pro.properties")

在需要注入的属性上添加如下注解

//EL表达式取出配置文件的值
@Value("${name}")
private String name;

4.3 再次启动测试类,查看控制台结果

结论:name属性已成功注入

4.4注意:使用properties的方式时,为防止乱码需要在IDEA中设置

5 yaml配置文件的其它操作

包括生成uuid,随机数,和占位符

5.1 修改application.yaml

person:
  name: sam${random.uuid} #生成uuid
  age: ${random.int} #随机int
  happy: false
  Date: 2022/02/28
  map: {k1: v1,k2: v2}
  list:
    - code
    - music
    - girl
  hello: 嘿嘿
  dog:
    name: ${person.hello:other}来福 #占位符
    age: 3

占位符如果不设置值,就会使用默认值,如上面的代码,如果没有给hello设置值,就会使用other

5.2 再次启动测试类,查看控制台结果

6 两种方式对比

结论:推荐使用yaml方式,如果每个业务中只需要配置文件中的某个值,可以使用一下@value

posted @ 2022-02-28 12:51  从0开始丿  阅读(1054)  评论(0编辑  收藏  举报