第三节,@Value和@ConfigurationProperties比较

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_32534855/article/details/82355649

1.表格

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

本文例子是yml配置文件

1.1松散绑定

@ConfigurationProperties 支持松散绑定

bean

/**
 * @anthor DencyCheng
 * @date 2018/9/3 0003
 */
@Component
@ConfigurationProperties(prefix = "goods")
public class Goods {
    private String goodsName;
    private Double price;

    //get set
}

配置文件可以为

goods:
  goods-name: 冰箱
  price: 20.0

goods:
  goods_name: 冰箱
  price: 20.0

goods:
  goodsName: 冰箱
  price: 20.0

@Value 不支持松散绑定

bean

/**
 * @anthor DencyCheng
 * @date 2018/9/3 0003
 */
@Component
public class Goods {
    @Value("${goods.goods_name}")
    private String goodsName;

    private Double price;

    //get set
}

配置文件可以为

goods:
  goods_name: 冰箱
  price: 20.0

这里可以看出@value 名称必须跟配置文件一致,但是@ConfigurationProperties支持松散绑定,意思就是可以用"_","-"代表大写

也就是 goods_name可以理解成goodsName

1.2SpEL

Spring :表达式语言

可以参考:https://www.cnblogs.com/goodcheap/p/6490896.html

@ConfigurationProperties 不支持

配置文件

goods:
  goods_name: 冰箱
  price: #{11*2}

bean

/**
 * @anthor DencyCheng
 * @date 2018/9/3 0003
 */
@Component
@ConfigurationProperties(prefix = "goods")
public class Goods {
    private String goodsName;
    private Double price;

    //get set
}

测试结果

Goods{goodsName='冰箱', price=null}

@Value 支持

配置文件

goods:
  goods_name: 冰箱
  price: 20

bean

/**
 * @anthor DencyCheng
 * @date 2018/9/3 0003
 */
@Component
public class Goods {
    @Value("${goods.goods_name}")
    private String goodsName;
    
    @Value("#{2*5}")
    private Double price;

    //get set
}

测试结果

Goods{goodsName='冰箱', price=10.0}

1.3JSR303数据校验

@ConfigurationProperties 支持

配置文件

goods:
  goods_name: 冰箱
  price:

bean文件

/**
 * @anthor DencyCheng
 * @date 2018/9/3 0003
 */
@Component
@ConfigurationProperties(prefix = "goods")
@Validated
public class Goods {
    private String goodsName;

    @NotNull
    private Double price;

    //get set
}

测试结果

Binding to target org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'goods' to com.dencycheng.demo.bean.Goods failed:

    Property: goods.price
    Value: null
    Origin: class path resource [application.yml]:13:9
    Reason: 不能为null

@Value 不支持

配置文件

goods:
  goods_name: 冰箱
  price:

bean文件

/**
 * @anthor DencyCheng
 * @date 2018/9/3 0003
 */
@Component
@Validated
public class Goods {
    @Value("${goods.goods_name}")
    private String goodsName;
    
    @NotNull
    @Value("${goods.price}")
    private Double price;

    //get set
}

测试结果

Goods{goodsName='冰箱', price=null}

1.4复杂类型封装

@ConfigurationProperties 支持

配置文件

goods:
  goods_name: 冰箱
  price: 20.0
  maps:
    k1: 10
    k2: Amy

bean文件

/**
 * @anthor DencyCheng
 * @date 2018/9/3 0003
 */
@Component
@ConfigurationProperties(prefix = "goods")

public class Goods {
    private String goodsName;

    private Double price;

    private Map<String,Object> maps;

    //get set
}

测试结果

Goods{goodsName='冰箱', price=20.0, maps={k1=10, k2=Amy}}

@Value 不支持

配置文件

goods:
  goods_name: 冰箱
  price:

bean文件

/**
 * @anthor DencyCheng
 * @date 2018/9/3 0003
 */
@Component
public class Goods {
    @Value("${goods.goods_name}")
    private String goodsName;
    
    @Value("${goods.price}")
    private Double price;

    @Value("${goods.maps}")
    private Map<String,Object> maps;

    //get set
}

测试结果

Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'goods.maps' in value "${goods.maps}"

2.总结

配置文件yml还是properties他们都能获取到值;

如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value;

如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties;

猜你喜欢

转载自blog.csdn.net/qq_32534855/article/details/82355649