spring boot中@ConfigurationProperties 与 @Value区别以及用法

目录

@Value(“”)介绍

@configurationProperties

@ConfigurationProperties 与 @Value比较

@Value(“”)介绍:

@Value(“”)介绍:用来指定bean中某一个属性的值,它的值可以是字面量,从配置文件获取的值,spel表达式

例如:

@Value("${person.last-name}")
private String lastName;
@Value("#{11*2}")
private Integer age;
@Value("true")
private Boolean boss;

配置文件做如下配置:

person.last-name=张三

@configurationProperties:

@configurationProperties:从配置文件中读取所有的属性的值;

例如:

package com.example.springboot02config.bean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
 * 将配置文件中配置的每一个属性的值映射到这个组件中
 *@ConfigurationProperties:这个注解的作用是告诉spring boot本类中的所有属性和配置文件中的配置进行绑定;
 * prefix = "person";指定与哪一个下面的属性进行映射
 * 只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能
 * @Component:把这个bean加入到容器中
 */
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private String lastName;
    private Integer age;
    private Boolean boss;
    private Date birth;
    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dogs;
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public Boolean getBoss() {
        return boss;
    }
    public void setBoss(Boolean boss) {
        this.boss = boss;
    }
    public Date getBirth() {
        return birth;
    }
    public void setBirth(Date birth) {
        this.birth = birth;
    }
    public Map<String, Object> getMaps() {
        return maps;
    }
    public void setMaps(Map<String, Object> maps) {
        this.maps = maps;
    }
    public List<Object> getLists() {
        return lists;
    }
    public void setLists(List<Object> lists) {
        this.lists = lists;
    }
    public Dog getDogs() {
        return dogs;
    }
    public void setDogs(Dog dogs) {
        this.dogs = dogs;
    }
    @Override
    public String toString() {
        final StringBuffer sb = new StringBuffer("Person{");
        sb.append("lastName='").append(lastName).append('\'');
        sb.append(", age=").append(age);
        sb.append(", boss=").append(boss);
        sb.append(", birth=").append(birth);
        sb.append(", maps=").append(maps);
        sb.append(", lists=").append(lists);
        sb.append(", dogs=").append(dogs);
        sb.append('}');
        return sb.toString();
    }
}

配置文件代码如下:

1.properties文件作为配置文件

#idea使用的是utf-8
#配置person的值
person.age=18
person.birth=2017/10/10
person.boss=false
person.maps.k1=v1
person.maps.k2=jiangsu
person.last-name=张三
person.lists=1,a,b,c
person.dogs.name=我是狗一号
person.dogs.age=18

2.yml文件作为配置文件

person:
  lastName: zhangsan
  age: 20
  boss: false
  birth: 2017/12/12
  maps: {k1: v1,k2: v2}
  lists:
    - lishi
    - zhaowu
  dogs:
    name: 小狗一号
    age: 8

@ConfigurationProperties 与 @Value比较:

@ConfigurationProperties 与 @Value异同点:

相同点:首先它们都可以用来自动配置某个或者某一些属性的值

比较:

1. 从功能上进行比较,@ConfigurationProperties批量注入配置文件中的属性;而@Value需要对指定属性的值一个个去配置

2. @ConfigurationProperties支持松散绑定,@Value不支持松散绑定

例如:对如下属性进行@ConfigurationProperties配置

private String lastName;

配置文件如下(properties文件):

person.LAST_NAME=张三
person.last-name=张三
person.last_name=张三

以上三种命名的配置方均可以对属性进行赋值;

而用@Value进行标注时,只能使用和配置文件名称一样的进行标注,例如:

@Value("${person.last_name}")
private String lastName;

配置文件:

person.last_name=张三

3.@ConfigurationProperties不支持spel语法,@Value支持spel语法

    @Value("#{11*2}")
    private Integer age;

4. @ConfigurationProperties支持JSR303数据校验,@Value不支持数据校验

例如使用以下的@Value给属性赋值,校验不会生效:

@Value("${person.last_name}")
@Email
private String lastName;

使用@ConfigurationProperties对属性赋值,校验会生效:

package com.example.springboot02config.bean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
import javax.validation.constraints.Email;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
 * 将配置文件中配置的每一个属性的值映射到这个组件中
 *@ConfigurationProperties:这个注解的作用是告诉spring boot本类中的所有属性和配置文件中的配置进行绑定;
 * prefix = "person";指定与哪一个下面的属性进行映射
 * 只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能
 * @Component:把这个bean加入到容器中
 */
@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {


    @Email
    private String lastName;
    private Integer age;
    private Boolean boss;
    private Date birth;
    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dogs;
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Boolean getBoss() {
        return boss;
    }

    public void setBoss(Boolean boss) {
        this.boss = boss;
    }

    public Date getBirth() {
        return birth;
    }

    public void setBirth(Date birth) {
        this.birth = birth;
    }

    public Map<String, Object> getMaps() {
        return maps;
    }

    public void setMaps(Map<String, Object> maps) {
        this.maps = maps;
    }

    public List<Object> getLists() {
        return lists;
    }

    public void setLists(List<Object> lists) {
        this.lists = lists;
    }

    public Dog getDogs() {
        return dogs;
    }

    public void setDogs(Dog dogs) {
        this.dogs = dogs;
    }

    @Override
    public String toString() {
        final StringBuffer sb = new StringBuffer("Person{");
        sb.append("lastName='").append(lastName).append('\'');
        sb.append(", age=").append(age);
        sb.append(", boss=").append(boss);
        sb.append(", birth=").append(birth);
        sb.append(", maps=").append(maps);
        sb.append(", lists=").append(lists);
        sb.append(", dogs=").append(dogs);
        sb.append('}');
        return sb.toString();
    }
}

配置文件:

person.age=18
person.birth=2017/10/10
person.boss=false
person.maps.k1=v1
person.maps.k2=jiangsu
person.last_name=张三
person.lists=1,a,b,c
person.dogs.name=我是狗一号
person.dogs.age=18

结果:变量lastName的值不符合邮箱格式执行会抛出异常

Property: person.lastName
Value: "张三"
Origin: class path resource [application.properties] - 9:18
Reason: 不是一个合法的电子邮件地址

5.@ConfigurationProperties支持复杂类型封装,@Value不支持复杂类型封装,例如Map类型就不能使用@Value进行配置

猜你喜欢

转载自blog.csdn.net/psjasf1314/article/details/128478738