springboot @Value 获取值和@ConfigurationProperties

一、环境

springboot环境中application.properties和application.yml文件都支持比较,这里使用application.yml

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.7.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.zixue</groupId>
<artifactId>spring-boot-demo-01</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-boot-demo-01</name>
<description>Demo project for Spring Boot</description>

<properties>
    <java.version>1.8</java.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

    <!-- 导入配置文件处理器,配置文件进行绑定就会有提示 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <version>2.1.0.RELEASE</version>
    </dependency>

</dependencies>

二、代码

//@ConfigurationProperties(prefix = "person")
@Component
public class Person {
    
    

    @Value("${person.name}")
    private String name;
    private boolean isBooss;
    private Date birthday;
//    @Value("${person.map}")
    private Map map;
    private List list;
    private Dog dog;
    @Value("#{10+20}")
    private int age;

    @Override
    public String toString() {
    
    
        return "Person{" +
                "name='" + name + '\'' +
                ", isBooss=" + isBooss +
                ", birthday=" + birthday +
                ", map=" + map +
                ", list=" + list +
                ", dog=" + dog +
                ", age=" + age +
                '}';
    }

    public String getName() {
    
    
        return name;
    }

    public void setName(String name) {
    
    
        this.name = name;
    }

    public Boolean getBooss() {
    
    
        return isBooss;
    }

    public void setBooss(Boolean booss) {
    
    
        isBooss = booss;
    }

    public Date getBirthday() {
    
    
        return birthday;
    }

    public void setBirthday(Date birthday) {
    
    
        this.birthday = birthday;
    }

    public Map getMap() {
    
    
        return map;
    }

    public void setMap(Map map) {
    
    
        this.map = map;
    }

    public List getList() {
    
    
        return list;
    }

    public void setList(List list) {
    
    
        this.list = list;
    }

    public Dog getDog() {
    
    
        return dog;
    }

    public void setDog(Dog dog) {
    
    
        this.dog = dog;
    }
} //dog部分就不加了,影响不大

三、application.yml文件

person:
  name: 理解
  isBooss:  false
  birthday: 2019/8/06
  map:
    k1: v1
    k2: v2
  list:
    - 1
    - 2
    - list
  dog:
    name: cat
    age: 1

四、@value使用场景

①使用之前必须关闭springboot提供的配置属性绑定注解@ConfigurationProperties(prefix = “person”),不然根本不是@value获取的值
支持如下:
			@Value("${person.name}")
			private String name;
			@Value("#{10+20}") //SpEL语法( #{ } )
			private int age;

报错情况如下:
			  @Value("${person.map}")
  			  private Map map; 
//Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'person.map' in value "${person.map}"

  		 	@Value("${person.is_booss;}") //但是支持@Value("${person.is-booss;}")
  			private boolean isBooss;
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'person.is_booss' in value "${person.is_booss}"  			  
②在person类上加上@Validated带校验功能
@Email
    @Value("${person.name}")
    private String name;

没有反应,所以作用无效

五、@ConfigurationProperties

①使用之前必须关闭springboot提供的配置属性绑定注解@ConfigurationProperties(prefix = “person”),不然根本不是@value获取的值
支持:
    @Value("#{10+20}")
    private int age;

报错情况如下(如果强加如下@value):
			  @Value("${person.map}")  //但是支持简单的@Value("${person.name}")
  			  private Map map; 
//Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'person.map' in value "${person.map}"

  		 	@Value("${person.is_booss;}") //但是支持@Value("${person.is-booss;}")
  			private boolean isBooss;
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'person.is_booss' in value "${person.is_booss}"  			  
②在person类上加上@Validated带校验功能
@Email
    @Value("${person.name}")
    private String name;
    
console显示如下:    
Description:

Binding to target org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'person' to com.zixue.springbootdemo.bean.Person failed:

    Property: person.name
    Value: 理解
    Origin: class path resource [application.yml]:2:9
    Reason: 不是一个合法的电子邮件地址

六、总结

对比项 @Value @ConfigurationProperties
作用 单个属性赋值 批量赋值整个组件
作用位置 方法、构造器、属性
SpEl 支持 支持 支持
松散语法 只支持(-) 支持
@Validated数据校验 不支持 支持
复杂类型 不支持 支持

猜你喜欢

转载自blog.csdn.net/jue6628/article/details/98668356