ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

springboot-yaml配置注入

2022-02-28 13:01:30  阅读:186  来源: 互联网

标签:springboot 配置文件 age list dog yaml 注入 public name


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

标签:springboot,配置文件,age,list,dog,yaml,注入,public,name
来源: https://www.cnblogs.com/lv1024/p/15945120.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有