@ConfigurationProperties和@Value的区别

原文链接:@ConfigurationProperties和@Value的区别 – 编程屋

目录

1 前言

2 @ConfigurationProperties和@value的区别

3 用法

3.1 @ConfigurationProperties

3.2 @Value

 4 指定配置文件


1 前言

在平时开发中,我们会将大量的参数配置在application.properties或者application.yml文件中,通过@ConfigurationProperties注解或者@value注解可以很方便的拿到这些值。

2 @ConfigurationProperties和@value的区别

两种注解斗能够读取配置文件中属性并绑定到javaBean中,但两种存在以下不同

1)使用位置不同

@ConfigurationProperties:标注在JavaBean的类名上;

@Value:标注在JavaBean的属性上。

2)功能

@ConfigurationProperties:用于批量绑定配置文件中的配置;

@Value:只能一个一个的指定需要绑定的位置,绑定粒度更小

3)松散绑定支持不同

@ConfigurationProperties:支持松散绑定,例如实体类Person中有一个属性为username,那么配置文件中的属性名支持以下写法:person.username、person_name、person.user_name、PERSON_USER_NAME

@Value:不支持松散绑定

4) 复杂类型封装

@ConfigurationProperties:支持所有类型的封装,例如Map、List、Set以及对象等

@Value:只支持基本数据类型的封装,例如:字符串、布尔值、整数等类型

5)应用场景不同,两者并没有明显的优劣势之分,它们只适合应用的场景不同。若只是获取配置文件中的某项值,则推荐使用@Value注解;若专门编写了一个JavaBean来和配置文件进行映射,则建议使用@ConfigurationProperties注解。

3 用法

3.1 @ConfigurationProperties

实体类:

package com.liubujun.springdataelasticsearch.entity;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * @Author: liubujun
 * @Date: 2022/6/30 13:57
 */

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

    private String username;

    private Integer age;

    private String address;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Integer getAge() {
        return age;
    }

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

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "Person{" +
                "username='" + username + '\'' +
                ", age=" + age +
                ", address='" + address + '\'' +
                '}';
    }

}

配置文件:

person.username=Tony老师
person.age=21
person.address=地球村

测试类:

 @Autowired
    private Person person;

    @Test
    public void test(){
        System.out.println("姓名:"+person.getUsername()+"、年龄:"+person.getAge()+"、地址:"+person.getAddress());
    }

运行结果:

 从运行结果中可发现我们能够成功的从配置文件中获取相关值。

注意:@ConfigurationProperties支持松散绑定

配置文件改成:

person.user_name=Tony老师
person.age=21
person.address=地球村

测试发现依然正常获取到值:

注意: @ConfigurationProperties支持复杂类型封装

配置文件改成:

person.user_name=Tony老师
person.age=21
person.address=地球村
person.email[0]=tony0@qq.com
person.email[1]=tony1@qq.com
person.email[2]=tony2@qq.com

实体类加个字段对应修改:

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


    private String username;


    private Integer age;


    private String address;

    private List<String> email;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Integer getAge() {
        return age;
    }

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

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public List<String> getEmail() {
        return email;
    }

    public void setEmail(List<String> email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return "Person{" +
                "username='" + username + '\'' +
                ", age=" + age +
                ", address='" + address + '\'' +
                ", email=" + email +
                '}';
    }
}

测试类:

@Autowired
    private Person person;


    @Test
    public void test(){
        System.out.println("姓名:"+person.getUsername()+"、年龄:"+person.getAge()+"、地址:"+person.getAddress()+"、email:"+person.getEmail());
    }

结果:

3.2 @Value

实体类如下:其它配置不变

@Component
public class Person {

    @Value("${person_username}")
    private String username;

    @Value("${person.age}")
    private Integer age;

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

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Integer getAge() {
        return age;
    }

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

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "Person{" +
                "username='" + username + '\'' +
                ", age=" + age +
                ", address='" + address + '\'' +
                '}';
    }

}

测试正常输出:

注意:@Value不能够支持松散绑定,如果将配置文件改成如下:

person.user_name=Tony老师
person.age=21
person.address=地球村

测试发现获取不到“username”的值,报错信息如下:

Error creating bean with name 'person': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'person_username' in value "${person_username}"

注意:@Value不支持复杂类型封装,将实体类增加一个List类型的字段

以上只是部分内容,为了维护方便,本文已迁移到新地址:@ConfigurationProperties和@Value的区别 – 编程屋

  • 8
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值