@ConfigurationProperties 与 @Value 都能够从配置文件中获取配置项。
这两个注解有什么区别呢?
@ ConfigurationProperties | @ Value | |
---|---|---|
功能 | 批量注入 | 单个注入 |
松散绑定(松散语法) | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
-
批量注入:前文中使用 @ConfigurationProperties 与@Value 发现,
@ConfigurationProperties 注解一个类或者方法就可以将所有的配置项注入到类中。而@Value 则需要将类中的每个属性注解才能读取配置项。 - 松散绑定(松散语法):就是配置文件中的属性书写方式。
person.fullName 与类中同名
person.full-name 使用 - 替换大写
person.full_name 使用 _ 替换大写
@Value 不支持 松散绑定 配置文件名必须和类属性名相同。否则则会报错
Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'person.fullNname' in value "${person.fullNname}"
- SpEL:EL 表达式
@Value("#{11*2}")
private Integer age;
- JSR303数据校验:
@Data
@Component
@ConfigurationProperties(prefix = "person")
@Validated //JSR303数据校验
public class Person {
@NotNull //不能为空
private String name;
@Email // 必须为Email 格式
private String fullName;
private Integer age;
private List<String> list;
private Map<String,String> map;
private Dog dog;
}
person:
name: xiaoming
full-name: 小明
age : 11
list:
-a -b -c -d
map: {key1: value1,key2: value2}
dog:
name: tom
age: 3
此时full-name并不是一个Email 格式内容,启动项目报错:
Binding to target org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'person' to com.example.demo.entity.Person failed:
Property: person.fullName
Value: 小明
Origin: class path resource [application.yml]:9:14
Reason: 不是一个合法的电子邮件地址
- 复杂类型封装: List Map 等。
@Value 并不支持读取复杂类型的配置项。