前言
结合上文:配置文件值注入到Java Bean,我们知道通过 @ConfigurationProperties
+ @Component
两个注解,可以将 yml / properties 配置文件中的内容直接注入到我们自定义的 Java Bean 中。
Spring 底层也有一个 @Value
注解,也可以帮我们获取到配置文件中的内容,并注入到 Java Bean 中。接下来我们就从几个方面来简单对比介绍。
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 批量注入配置文件中的属性 | 一个个指定 |
松散绑定(松散语法) | 支持 | 不支持 |
Spring EL表达式 | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
application.yml配置文件如下:
person:
name: 扛麻袋的少年
age: 27
isManager: true
birthday: 2020/03/27
map:
k1: v1
k2: v2
list:
- basketball
- tennis
- swim
address:
province: 山西省
distinct: 晋中市
county: 祁县
1.功能对比
@ConfigurationProperties 注解,可以批量注入配置文件中的属性。
它的具体使用,此处不再过多介绍,请参考:配置文件值注入到Java Bean
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private int age;
private boolean isManager;
private Date birthday;
private Map<String,Object> map;
private List<String> list;
private Address address;
/** * 此处省略get/set/toString() 方法 */
}
@Value注解,只能一个一个来指定。
@Component
public class Person {
@Value("${person.name}")//@Value 方式,只能一个一个来指定。
private String name;
@Value("${person.age}")
private int age;
private boolean isManager;
private Date birthday;
private Map<String,Object> map;
}
2.松散绑定
松散绑定,即:如果你的属性为 lastName 这种格式,你可以通过 last-name 的方式成功绑定,反之亦可成功绑定。(驼峰编写,会自动转成-小写字母
的方式;-小写字母
的方式也会识别成驼峰,反正就是两个能相互被识别,就这意思了)
@ConfigurationProperties 注解,支持松散绑定
(因为在 Spring 中,以 is 开头的属性有特殊意义,会被认作是 boolean 型),所以此处我们将 yml 配置文件的 isManager
换成 issManager
来做个简单测试即可,然后来再次验证一下,还是可以正确绑定。
@Value注解,就不支持松散绑定了
,必须是一模一样的名称,才可以正常绑定。
3.EL表达式
@ConfigurationProperties 注解,不支持EL表达式,此处不作介绍。
但是 @Value 是可以支持 EL 表达式
,实例如下:
@Component
public class Person {
@Value("#{James}")
private String name;
@Value("#{28+10}")
private int age;
@Value("#{true}") //通过#{} EL表达式方式,可以直接赋值
private boolean isManager;
private Date birthday;
}
4.JSR303数据校验
@ConfigurationProperties 注解,支持 JSR303 数据校验
。 @ConfigurationProperties 注解如需要实现数据校验,最好配合 @Validated 注解。@Value注解,不支持JSR303数据校验,此处不作介绍。
@Component
@ConfigurationProperties(prefix = "person")
@Validated//说明该类需要被校验
public class Person {
@Size(min = 1, max = 3)
private String name;
private int age;
private boolean isManager;
private Date birthday;
/** * 省略部分代码 */
}
本例校验名称,长度必须在 1 到 3 之前,测试发现 扛麻袋的少年
,显然大于 3,说明 @ConfigurationProperties 注解支持 JSR303数据校验。
附:部分校验注解
限制 | 说明 |
---|---|
@Null | 限制只能为null |
@NotNull | 限制必须不为null |
@AssertFalse | 限制必须为false |
@AssertTrue | 限制必须为true |
@DecimalMax(value) | 限制必须为一个不大于指定值的数字 |
@DecimalMin(value) | 限制必须为一个不小于指定值的数字 |
@Digits(integer,fraction) | 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction |
@Max(value) | 限制必须为一个不大于指定值的数字 |
@Min(value) | 限制必须为一个不小于指定值的数字 |
@Future | 限制必须是一个将来的日期 |
@Past | 限制必须是一个过去的日期 |
@Pattern(value) | 限制必须符合指定的正则表达式 |
@Size(max,min) | 限制字符长度必须在min到max之间 |
@NotEmpty | 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0) |
@NotBlank | 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格 |
验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式 |
5.复杂类型封装
@ConfigurationProperties 注解,支持复杂类型(对象等)的直接封装
。 @ConfigurationProperties 直接可以对yml配置文件中的 Address 对象进行封装,如下图所示:@Value注解,不支持复杂类型封装,此处不作介绍。
博主写作不易,来个关注呗
求关注、求点赞,加个关注不迷路 ヾ(◍°∇°◍)ノ゙
博主不能保证写的所有知识点都正确,但是能保证纯手敲,错误也请指出,望轻喷 Thanks♪(・ω・)ノ