SpringBoot开发【配置】@ConfigurationProperties和Value的区别

本文对比了SpringBoot中@ConfigurationProperties和@Value两种方式从配置文件中获取值的区别,包括映射方式、松散绑定、SpEL支持、JSR303数据校验和复杂类型封装。通过实例展示了它们在不同场景下的适用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一篇我们讲解了用@ConfigurationProperties获取配置文件的值,这次我们来讲另一种方法,@Value

Value方法获取配置文件的值

我们把@ConfugurationProperties注释掉,然后加上value注释($匹配,#后边的为算术式)

/**
 * 将配置文件中配置的没一个属性的值映射到这个组建中
 * @configurationproperties:告诉springboot将本类中的所有属性和配置文件中相关的配置进行绑定
 * prefix="person"配置文件中person下面的所有属性进行一一映射
 * 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties的功能
 */
@Component
//@ConfigurationProperties(prefix="person")
public class Person {

    /*
    <bean class="person">
        <property name="lastName" value="自变量/$/{key}从环境变量配置文件中获取值/#{SpEL}"></property>
    <bean/>
     */
    @Value("${person.last-name}")
    private String lastName;
    @Value("#{10*2}")
    private Integer age;
    @Value("true")
    private Boolean boss;
    private Date birth;
    private Map<String,Object> maps;
    private List<Object>lists;
    private Dog dog;

我们来测试一下
测试结果在这里我们匹配的三个选项都匹配成功,成功导出
下面我们来分析一下@ConfigurationProperties与@Value的区别
功能:结合上一篇我们使用的@ConfigurationProperties,我们会发现使用@ConfigurationProperties可以直接全部进行映射,而@Value必须要一个一个的去映射
松散绑定:我们可以试验一下,将 @Value("${person.last-name}")中的last-name改为last.name,运行一下会发现报错;实验一下@ConfigurationProperties,发现运行成功过。所以,@ConfigurationProperties
支持松散绑定,@Value不支持
SpEL:我们使用@Value时支持算术式,在使用@ConfigurationProperties时,我们尝试把配置文件age处改为算术式时,运行会报错
JSR303数据校验:我们加一个@Validated注解,然后加一个校验规则,比如加一个@Emile,校验匹配是否为电子邮箱格式。先给@ConfigurationProperties检验

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

    /*
    <bean class="person">
        <property name="lastName" value="自变量/$/{key}从环境变量配置文件中获取值/#{SpEL}"></property>
    <bean/>
     */
    //@Value("${person.last-name}")
    //last-name必须为邮箱格式
    @Email
    private String lastName;
    //@Value("#{10*2}")
    private Integer age;
    //@Value("true")
    private Boolean boss;
    private Date birth;
    private Map<String,Object> maps;
    private List<Object>lists;
    private Dog dog;

测试结果我们发现检验出来错误,说明@ConfigurationProperties支持JSR303数据校验
然后我们再用@Value时进行检验

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

    /*
    <bean class="person">
        <property name="lastName" value="自变量/$/{key}从环境变量配置文件中获取值/#{SpEL}"></property>
    <bean/>
     */

    //last-name必须为邮箱格式
    @Email
    @Value("${person.last-name}")
    private String lastName;
    @Value("#{10*2}")
    private Integer age;
    @Value("true")
    private Boolean boss;
    private Date birth;
    private Map<String,Object> maps;
    private List<Object>lists;
    private Dog dog;

测试结果我们发现并没有变化,所以@Value不支持JSR303数据校验
复杂类型封装:我们单独用@Value来获取一下maps

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

    /*
    <bean class="person">
        <property name="lastName" value="自变量/$/{key}从环境变量配置文件中获取值/#{SpEL}"></property>
    <bean/>
     */

    //last-name必须为邮箱格式
    @Email
    //@Value("${person.last-name}")
    private String lastName;
    //@Value("#{10*2}")
    private Integer age;
   // @Value("true")
    private Boolean boss;
    private Date birth;
    @Value("{person.maps}")
    private Map<String,Object> maps;
    private List<Object>lists;
    private Dog dog;

测试结果我们发现报错了,所以说@Value不支持复杂类型封装,这是@ConfigurationProperties和@Value 最大的区别

区别
配置文件不管是yml还是properties都能获取到值

用法
1.如果说我们在某个业务逻辑中需要获取一下配置文件的某项值,使用@Value;
这里我们可以写一个Controller

@RestController
public class Controller {

    @Value("${person.last-name}")
    private String name;

    @RequestMapping("/sayHello")
    public String sayHello(){

        return "Hello " +name;
    }

}@RestController
public class Controller {

    @Value("${person.last-name}")
    private String name;

    @RequestMapping("/sayHello")
    public String sayHello(){

        return "Hello " +name;
    }

}

运行测试,网页测试
测试结果
2.如果说我们专门编写了一个JavaBean来和配置文件进行映射时,我们就直接使用@ConfigurationProperties

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值