两种注解对比分析
下面,针对Spring Boot支持的配置文件属性注入的两个主要注解@ConfigurationProperties和@Value进行了对比分析,具体如表1所示。
表1 @ConfigurationProperties和@Value注解对比分析
对比点 | @ConfigurationProperties | @Value |
---|---|---|
底层框架 | Spring Boot | Spring |
功能 | 批量注入配置文件中的属性 | 单个注入 |
属性setXX()方法 | 需要 | 不需要 |
复杂类型属性注入 | 支持 | 不支持 |
松散绑定 | 支持 | 不支持 |
JSR303数据校验 | 支持 | 不支持 |
SpEL表达式 | 不支持 | 支持 |
关于表1中@ConfigurationProperties和@Value注解的对比分析,具体说明如下。
1.底层框架
@ConfigurationProperties注解是Spring Boot框架自带的;而@Value注解是Spring框架支持的,只不过Spring Boot框架对Spring进行了默认支持,所以也可以使用@Value注解的相关功能。
2.功能
@ConfigurationProperties主要用于将配置文件中某一类属性整体批量读取并注入到某个Bean的属性中;而@Value则是在需要在注入属性值的每一个属性上都进行注入配置。
3.属性setXX()方法
在使用@ConfigurationProperties注解进行配置文件属性值读取注入时,还必须为每一个属性设置setXX()方法,通过对应的注解才能够将配置文件中的属性一一匹配并注入到对应的Bean属性上。如果配置文件中没有配置属性值,则会自动将对应的Bean属性设置为空。
@Value完全不需要为属性设置setXX()方法,该注解会先通过表达式读取配置文件中指定的属性值,然后自动注入到下方的Bean属性上。如果读取的配置文件属性为空,进行属性注入时程序会自动报错。
4.复杂类型属性注入
在读取配置文件属性值并注入到Bean中的属性中时,@ConfigurationProperties注解支持任意数据类型(包括基本数据类型和复杂数据类型)的属性注入;@Value只支持基本数据类型的属性读取和注入,在读取复杂数据类型配置文件时会直接解析失败。
5.松散绑定
@ConfigurationProperties注解进行配置文件属性值注入时,支持松散绑定语法。例如Person类有一个字符串类型的属性firstName,那么在配置文件中进行属性配置时可以使用如下配置方式。示例代码如下。
person.firstName=james // 标准写法,对应Person类属性名
person.first-name=james // 使用横线-分隔多个单词
person.first_name=james // 使用下划线_分隔多个单词
PERSON.FIRST_NAME=james // 使用大小写格式,推荐常量属性配置
上述示例列举了@ConfigurationProperties注解配置文件属性值注入时,支持的配置文件语法,属于松散绑定语法,而@Value注解不支持此功能。
6.JSR303数据校验
@ConfigurationProperties注解进行配置文件属性值注入时,支持JSR303数据校验,其主要作用是校验配置文件中注入到对应Bean属性的值是否符合相关值的规则,示例代码如下。
@Component
@ConfigurationProperties(prefix = "person")
@Validated // 引入Spring框架支持的数据校验规则
public class Example {
@Email // 对属性进行规则匹配
private String email;
public void setEmail(String email) {
this.email = email;
}
}
上述代码中,使用@ConfigurationProperties注解注入配置文件属性值时,在实体类Example上引入@Validated注解用于数据校验,在属性email上引入@Email注解进行对应规则校验。如果注入的配置文件属性值不符合相关校验规则,程序会自动报错。@Value注解不支持JSR303数据校验功能。
6.SpEL表达式
@Value注解注入配置文件属性时,支持SpEL表达式语法,即“#{xx}”。例如Person类有一个整数类型的属性id,直接使用SpEL表达式语法进行属性注入,示例代码如下。
@Value("#{5*2}") // 使用@Value注解的SpEL表达式直接为属性注入值
private int id;
上述代码中,列举了在不使用配置文件的情况下,可以直接使用@Value注解支持的SpEL表达式进行Bean的属性值注入,而@ConfigurationProperties注解不支持此功能。
前面部分对@ConfigurationProperties和@Value两种注解进行配置文件属性值注入的主要区别进行了对比分析,那么在实际开发中,到底如何选择使用呢?这里参考两种注解的主要优缺点,并结合实际开发情况,具体选择说明如下。
● 如果只是针对某一个业务需求,要引入配置文件中的个别属性值,推荐使用@Value注解;
● 如果针对某个JavaBean类,需要批量注入属性值,则推荐使用@ConfigurationProperties注解。