SpringBoot教程(3) @ConfigurationProperties和@Value的使用区别


@ConfigurationProperties和@Value都是用来获取配置文件里的配置信息的,在一个项目中,这2种方式都比较常用,根据不同的场景,选择使用它们。

一、@ConfigurationProperties的使用

1. 导入spring-boot-configuration-processor

spring-boot-configuration-processor方便在写配置文件时,有自动提示,首次引入后要启动下项目。

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-configuration-processor</artifactId>
      <optional>true</optional>
</dependency>

2. 编写配置文件

  • 冒号: 一定是英文冒号,其后面有一个空格
  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进不允许使用tab,只允许空格
  • 缩进的空格数不重要,只要相同层级的元素左对齐即可
  • maps是map类型,{}里是Key: Value
  • lists是列表类型,每个值一行,以- 开头
  • dog是一个对象
  • dogs是对象列表
pigg:
  person:
    name: 冬哥
    age: 33
    boss: false
    birth: 1989/12/26
    maps: {
    
    k1: v1, k2: v2}
    lists:
      - item1
      - item2
      - item3
    dog:
      name: 小狗
      age: 3
    dogs:
      - {
    
    name: 小狗, age: 3}
      - {
    
    name: 小狗2, age: 3}

3. 定义配置信息类

PiggPerson 类,
当我们为属性配置错误的值时,而又不希望 Spring Boot 应用启动失败,我们可以设置 ignoreInvalidFields 属性为 true (默认为 false)

@Data
@Component
@ConfigurationProperties(prefix = "pigg.person", ignoreInvalidFields = true)
public class PiggPerson {
    
    

    private String name;

    private Integer age;

    private Boolean boss;

    private Date birth;

    private Map<String, Object> maps;

    private List<Object> lists;

    private PiggDog dog;
    
	private List<PiggDog> dogs;

    public PiggPerson() {
    
    
        System.out.println("初始化了PiggPerson()");
    }
}

PiggDog 类

@Data
public class PiggDog {
    
    

    private String name;

    private Integer age;
}

4. 测试

    @Test
    void getPersonInfo(){
    
    
        System.out.println(person.toString());
    }

正确获取到配置文件中值。

PiggPerson(name=冬哥, age=33, boss=false, birth=Tue Dec 26 00:00:00 CST 1989, maps={
    
    k1=v1, k2=v2}, lists=[item1, item2, item3], dog=PiggDog(name=小狗, age=3), dogs=[PiggDog(name=小狗, age=3), PiggDog(name=小狗2, age=3)])

二、@Value的使用

1. 配置文件

pigg:
  cat:
    brand: 加菲猫
    price: 500

2. 用@Value获取值

可以设置默认值,在key的后面加冒号,比如下面的good属性,如果配置文件里没有配置,默认为true

@Data
@Component
public class PiggCat {
    
    

    @Value("${pigg.cat.brand}")
    private String brand;

    @Value("${pigg.cat.price}")
    private Integer price;

    //没有配置默认为true
    @Value("${pigg.cat.good:true}")
    private Boolean good;
}

3. 测试

    @Test
    void getPiggCat(){
    
    
        System.out.println(cat.toString());
    }

输出

PiggCat(brand=加菲猫, price=500, good=true)

三、@ConfigurationProperties和@Value区别

  • @ConfigurationProperties能够批量注入配置文件中的属性给bean,而@Valie只能一个个注入。
  • @ConfigurationProperties支持松散绑定,而@Value不支持。
  • @ConfigurationProperties不支持spEL,而@Value支持,例如#{10*20}。
  • @ConfigurationProperties支持JSR303数据校验,而@Value不支持。
  • @ConfigurationProperties支持复杂类型的数据注入,而@Value不支持复杂类型,例如Map

猜你喜欢

转载自blog.csdn.net/winterking3/article/details/114542048