前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >第三节,Springboot@Value和@ConfigurationProperties比较

第三节,Springboot@Value和@ConfigurationProperties比较

作者头像
DencyCheng
发布2018-11-05 16:01:10
1.6K0
发布2018-11-05 16:01:10
举报
文章被收录于专栏:SpringBootSpringBoot

版权声明:本文为博主原创文章,未经博主允许不得转载。

1.表格

@ConfigurationProperties

@Value

功能

批量注入配置文件中的属性

一个个指定

松散绑定(松散语法)

支持

不支持

SpEL

不支持

支持

JSR303数据校验

支持

不支持

复杂类型封装

支持

不支持

本文例子是yml配置文件

1.1松散绑定

@ConfigurationProperties 支持松散绑定

bean

代码语言:javascript
复制
/**
 * @anthor DencyCheng
 * @date 2018/9/3 0003
 */
@Component
@ConfigurationProperties(prefix = "goods")
public class Goods {
    private String goodsName;
    private Double price;

    //get set
}

配置文件可以为

代码语言:javascript
复制
goods:
  goods-name: 冰箱
  price: 20.0

goods:
  goods_name: 冰箱
  price: 20.0

goods:
  goodsName: 冰箱
  price: 20.0

@Value 不支持松散绑定

bean

代码语言:javascript
复制
/**
 * @anthor DencyCheng
 * @date 2018/9/3 0003
 */
@Component
public class Goods {
    @Value("${goods.goods_name}")
    private String goodsName;

    private Double price;

    //get set
}

配置文件可以为

代码语言:javascript
复制
goods:
  goods_name: 冰箱
  price: 20.0

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

也就是 goods_name可以理解成goodsName

1.2SpEL

Spring :表达式语言

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

@ConfigurationProperties 不支持

配置文件

代码语言:javascript
复制
goods:
  goods_name: 冰箱
  price: #{11*2}

bean

代码语言:javascript
复制
/**
 * @anthor DencyCheng
 * @date 2018/9/3 0003
 */
@Component
@ConfigurationProperties(prefix = "goods")
public class Goods {
    private String goodsName;
    private Double price;

    //get set
}

测试结果

代码语言:javascript
复制
Goods{goodsName='冰箱', price=null}

@Value 支持

配置文件

代码语言:javascript
复制
goods:
  goods_name: 冰箱
  price: 20

bean

代码语言:javascript
复制
/**
 * @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
}

测试结果

代码语言:javascript
复制
Goods{goodsName='冰箱', price=10.0}

1.3JSR303数据校验

@ConfigurationProperties 支持

配置文件

代码语言:javascript
复制
goods:
  goods_name: 冰箱
  price:

bean文件

代码语言:javascript
复制
/**
 * @anthor DencyCheng
 * @date 2018/9/3 0003
 */
@Component
@ConfigurationProperties(prefix = "goods")
@Validated
public class Goods {
    private String goodsName;

    @NotNull
    private Double price;

    //get set
}

测试结果

代码语言:javascript
复制
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 不支持

配置文件

代码语言:javascript
复制
goods:
  goods_name: 冰箱
  price:

bean文件

代码语言:javascript
复制
/**
 * @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
}

测试结果

代码语言:javascript
复制
Goods{goodsName='冰箱', price=null}

1.4复杂类型封装

@ConfigurationProperties 支持

配置文件

代码语言:javascript
复制
goods:
  goods_name: 冰箱
  price: 20.0
  maps:
    k1: 10
    k2: Amy

bean文件

代码语言:javascript
复制
/**
 * @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
}

测试结果

代码语言:javascript
复制
Goods{goodsName='冰箱', price=20.0, maps={k1=10, k2=Amy}}

@Value 不支持

配置文件

代码语言:javascript
复制
goods:
  goods_name: 冰箱
  price:

bean文件

代码语言:javascript
复制
/**
 * @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
}

测试结果

代码语言:javascript
复制
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'goods.maps' in value "${goods.maps}"

2.总结

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

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

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年09月03日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.表格
    • 本文例子是yml配置文件
      • 1.1松散绑定
        • @ConfigurationProperties 支持松散绑定
        • @Value 不支持松散绑定
      • 1.2SpEL
        • @ConfigurationProperties 不支持
        • @Value 支持
      • 1.3JSR303数据校验
        • @ConfigurationProperties 支持
        • @Value 不支持
      • 1.4复杂类型封装
        • @ConfigurationProperties 支持
        • @Value 不支持
    • 2.总结
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档