springBoot @ConfigurationProperties 与@Value的区别

@ConfigurationProperties 与 @Value 都能够从配置文件中获取配置项。
这两个注解有什么区别呢?

@ ConfigurationProperties @ Value
功能 批量注入 单个注入
松散绑定(松散语法) 支持 不支持
SpEL 不支持 支持
JSR303数据校验 支持 不支持
复杂类型封装 支持 不支持
  1. 批量注入:前文中使用 @ConfigurationProperties 与@Value 发现,
    @ConfigurationProperties 注解一个类或者方法就可以将所有的配置项注入到类中。而@Value 则需要将类中的每个属性注解才能读取配置项。
  2. 松散绑定(松散语法):就是配置文件中的属性书写方式。

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}"
  1. SpEL:EL 表达式
@Value("#{11*2}")
private Integer age;
  1. 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 list;
    private Map 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: 不是一个合法的电子邮件地址
  1. 复杂类型封装: List Map 等。

@Value 并不支持读取复杂类型的配置项。

你可能感兴趣的:(springBoot @ConfigurationProperties 与@Value的区别)