本文目录:
- 前言
- 1.功能对比
- 2.松散绑定
- 3.EL表达式
- 4.JSR303数据校验
- 附:部分校验注解
- 5.复杂类型封装
前言
结合上文:配置文件值注入到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♪(・ω・)ノ
最后
以上就是失眠钢笔最近收集整理的关于注解@ConfigurationProperties 和 @Value 对比前言的全部内容,更多相关注解@ConfigurationProperties内容请搜索靠谱客的其他文章。
发表评论 取消回复