引言
Spring Boot从配置文件中取值的方式有两种,一种是批量注入@ConfigurationProperties,另一种是单独注入@Value。
它们之间除了批量与单独取值的区别之外,还存在着其他一些使用方式,本篇博客将详细讲解这两种注解之间的区别和使用方式。
一、区别比较
注:
松散绑定,指配置文件中的属性名与Bean中的属性名大小写不完全一致,但是字母相同的情况。
比如bean中可以是Birth_day,配置文件(yaml)中是 bir-thday、或 BIRTH_DAY、或b-i-r-t-h-d-a-y等。
SpEL,指的是spring 表达式,格式:#{SpEL expression} ,如:#{2 * 10}
JSR303数据校验,Jsr-303是一种注解方式的数据校验,可以通过标记在属性上来判断从配置文件中映射的值是否符合我们的要求,如@NotNull字段不允许为空、@Email字段格式必须是电子邮件,这些注解一般都被放在javax.validation.constraints包下,并且除了将这些校验注解标记在属性上,另外还需要在被校验的类上标记@Validated注解(org.springframework.validation.annotation包下)才能生效。
复杂类型,指对象、Map、List等,相对的是简单类型如:字符串、数值、日期、布尔等。
二、@Value 使用
如果在 配置文件中有属性配置,可以直接通过@Value注入到目标类中。
@Value("${spring.datasource.url}")
private String url;
三、@ConfigurationProperties 使用
在企业实际开发中,有时候需要一些和业务相关的配置,且配置项较多,于是,我们就可以通过 @ConfigurationProperties 来完成。
与 @Value 的单兵作战不同,@ConfigurationProperties 可以和一个 完整的类进行映射,因此,会通过一个 XxxProperties 类来组织这些配置。
通常,我们会为 @ConfigurationProperties 添加 一个 prefix 属性,这个属性最好与类名的Xxx保持一致:
然后,我们为配置类添加一些属性,并在 配置文件中为它们进行赋值即可。
总结
@ConfigurationProperties和@Value的使用都是比较简单的。首先,最重要的就是前者是批量导入属性,后者是单独导入某一条属性。
他们的区别主要是对一些特性的支持如松散绑定、SpEL、JSR-303数据校验、复杂类型的封装。
关于如何在全局配置文件中定义复杂类型,可以参考另一篇文章《Spring Boot————YAML配置文件》
更多Spring Boot技术分享,可以关注博主,也可以文末留言。