版权声明:本文为博主原创文章,未经博主允许不得转载。
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 批量注入配置文件中的属性 | 一个个指定 |
松散绑定(松散语法) | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
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
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
Spring :表达式语言
可以参考:https://www.cnblogs.com/goodcheap/p/6490896.html
配置文件
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}
配置文件
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}
配置文件
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
配置文件
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}
配置文件
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}}
配置文件
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}"
配置文件yml还是properties他们都能获取到值;
如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value;
如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties;