欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Springboot学习笔记三、 @ConfigurationProperties 与@Value 对比

程序员文章站 2022-04-19 22:40:18
...

一、介绍

1、两个注解作用都是将每一个属性的值,映射到组件中。

2、@ConfigurationProperties 可以批量绑定配置文件中的值与类中的属性。

二、对比

  @ConfigurationProperties @Value
功能 批量注入配置文件中的属性 一个一个绑定
松撒绑定(松撒语法) 支持 不支持
SpEL 不支持 支持
JSR303数据校验 支持 不支持
复杂数据类型封装 支持 不支持

1)说明松散绑定 是只 person.last-name   与类中 lastName中的绑定 用@Value绑定会报错

2)复杂类型封装是指 类似Map List 这种会报错

三、代码

package com.hao.firstdemo.configs;


import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
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;

/**
 * @author haoxiansheng
 * @data 2020/5/27
 */
@Component
@ConfigurationProperties(prefix = "person") // 默认从全局文件中获取值
@PropertySource(value = {"classpath:person.properties"})
@Data
@Validated // 开启注解校验
public class Person {
    /**
     * <bean class="Person">
     *     <property name="lastName" value="字面量/${key}从环境变量配置文件中获取/#{SPEL}"><property/>
     * <bean/>
     */
    //@Email ConfigurationProperties 支持注解校验 Value 不支持
    //@Value("${person.lastName}")
    private String lastName;
    //@Value("#{11*2}") // SPEL 表达式
    private Integer age;
    //@Value("true")
    private Boolean boss;
    private Date birth;
    //@Value("${person.maps}") // 不支持复杂类型的封装
    private Map<String, Object> maps;
    private List<String> lists;
    private Dog dog;

    @Override
    public String toString() {
        return "Person{" +
                "lastName='" + lastName + '\'' +
                ", age=" + age +
                ", boss=" + boss +
                ", birth=" + birth +
                ", maps=" + maps +
                ", lists=" + lists +
                ", dog=" + dog +
                '}';
    }
}

package com.hao.firstdemo.configs;

import lombok.Data;
import lombok.ToString;

/**
 * @author haoxiansheng
 * @data 2020/5/27
 */
@Data
@ToString
public class Dog {
    private String name;
    private Integer age;
}



// application,properties中的属性
server.port=8081
spring.profiles.active=dev

# 配置person的值
#person.last-name=zhangsan
person.lastName=zhangsan
person.age=18
person.birth=1996/01/02
person.boss=false
person.maps.k1=v1
person.maps.k2=v2
person.lists=a,b,c
person.dog.name=dog
person.dog.age=10

@PropertySource(value = {"classpath:person.properties"})
// 外部加载的方式
## 配置person的值
##person.last-name=zhangsan
#person.lastName=zhangsan
#person.age=18
#person.birth=1996/01/02
#person.boss=false
#person.maps.k1=v1
#person.maps.k2=v2
#person.lists=a,b,c
#person.dog.name=dog
#person.dog.age=10

四、批量绑定适合用 @ConfigurationProperties ,@Value适合绑定少一点的比如一两个