SpringBoot 中 读取yml、properties 配置文件中的值,注入到实体类中

时间:2024-10-30 10:17:06

这里写目录标题

    • 读取 yaml 配置文件 中的数据,映射到 实体类中
      • 1、使用@ConfigurationProperties("person") 注解
    • 读取 properties 配置文件 中的数据,映射到 实体类中
      • 1、使用@ConfigurationProperties("person") 注解
      • 2、使用@PropertySource(value ="classpath:") 和 @Value("${}") 注解
    • @Value注解 和 @ConfigurationProperties注解 的 对比
    • 参考目录

读取 yaml 配置文件 中的数据,映射到 实体类中

1、使用@ConfigurationProperties(“person”) 注解

文件中的 值(springboot 会自动 读取 四个位置中的以application为名字开头的配置文件,配置文件类型支持 properties、yaml,yml)

person:
  name: qinjiang${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}_旺财  #存在person.hello的值就用,不存在就用 other
    age: 1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

person 实体类

/*
@ConfigurationProperties作用:
将配置文件中配置的每一个属性的值,映射到这个组件中;
告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
参数 prefix = “person” : 将配置文件中的person下面的所有属性一一对应
*/
@Component  //注册bean到容器中
@ConfigurationProperties("person")
public class person {

    private String name;
    private Integer age;
    private Boolean happy;
    private Date birth;
    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;
//省去了 构造方法、get set 方法、toString 方法
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

Dog 实体类

@Component  //注册bean到容器中
public class Dog {
    private String name;
    private Integer age;
    //省去了 构造方法、get set 方法、toString 方法
  • 1
  • 2
  • 3
  • 4
  • 5

在测试类中,进行测试

@SpringBootTest
class CookfoodApplicationTests {

    @Autowired
    com.ouring.pojo.person person;
    @Test
    void contextLoads() {
        System.out.println(person);
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

在这里插入图片描述
在这里插入图片描述

读取 properties 配置文件 中的数据,映射到 实体类中

1、使用@ConfigurationProperties(“person”) 注解

【注意】properties配置文件在写中文的时候,会有乱码 , 我们需要去IDEA中设置编码格式为UTF-8;

settings–>FileEncodings 中配置;

在这里插入图片描述

文件中的 内容(springboot 会自动 读取 四个位置中的以application为名字开头的配置文件,配置文件类型支持 properties、yaml,yml)

person.name=koma
person.age=12345
person.happy=false
person.birth=2000/01/01

person.maps.koma1=koma1
person.maps.koma2=koma2


person.lists[0]=lili0
person.lists[1]=lili1
person.lists[2]=lili2

person.dog.name=_旺财
person.dog.age=99
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

实体类,与测试类,都不变。(也就是 还是@ConfigurationProperties("person") 这个注解在发挥作用,值必须来自于 springboot 自动获取的 配置文件中的信息)

在这里插入图片描述
在这里插入图片描述

但是,同样的我们可以自定义,使用哪个配置文件中的内容。

2、使用@PropertySource(value =“classpath:”) 和 @Value("${}") 注解

在这里插入图片描述
文件中的内容

=zhangsan
=2000/07/31
=lili5,lili4,lili3
  • 1
  • 2
  • 3
@Component  //注册bean
@PropertySource(value ="classpath:")  //加载指定的配置文件;
public class person {

    @Value("${}")    //1、这个注解,也会自动的从springboot自动获取的配置文件中,寻找与之配对的数值进行注入。
    private String name;
    @Value("#{9*7}")  // #{SPEL} Spring表达式,之前也一直在mybatis的 XML 配置中使用 
    private Integer age;
    @Value("true") // 字面量 
    private Boolean happy;
    @Value("${}") //2、就像上面中的配置文件的数据,会注入到与之配对的变量,并且外层的配置文件的优先级更高。
    private Date birth;
    @Value("${}")
    private List<Object> lists;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

@Value注解 和 @ConfigurationProperties注解 的 对比

在这里插入图片描

1、@ConfigurationProperties只需要写一次即可 , @Value则需要每个字段都添加

2、松散绑定:这个什么意思呢? 比如我的yml中写的last-name,这个和lastName是一样的, - 后面跟着的字母默认是大写的。这就是松散绑定。可以测试一下

3、JSR303数据校验 , 这个就是我们可以在字段是增加一层过滤器验证 , 可以保证数据的合法性

4、复杂类型封装,yml中可以封装对象 , 使用value就不支持

结论:

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

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

参考目录

狂神
/hellokuangshen/p/
B站 狂神
/video/BV1PE411i7CV?p=4

SpringBoot 官方文档,对于 这些 注解的 描述 与 使用
/spring-boot/docs/2.5.4/reference/htmlsingle/#-bean-binding