@ConfigurationProperties和@Value的使用区别
@ConfigurationProperties和@Value都是用来获取配置文件里的配置信息的,在一个项目中,这2种方式都比较常用,根据不同的场景,选择使用它们。
一、@ConfigurationProperties的使用
1. 导入spring-boot-configuration-processor
spring-boot-configuration-processor方便在写配置文件时,有自动提示,首次引入后要启动下项目。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
2. 编写配置文件
- 冒号: 一定是英文冒号,其后面有一个空格
- 大小写敏感
- 使用缩进表示层级关系
- 缩进不允许使用tab,只允许空格
- 缩进的空格数不重要,只要相同层级的元素左对齐即可
- maps是map类型,{}里是Key: Value
- lists是列表类型,每个值一行,以- 开头
- dog是一个对象
- dogs是对象列表
pigg:
person:
name: 冬哥
age: 33
boss: false
birth: 1989/12/26
maps: {
k1: v1, k2: v2}
lists:
- item1
- item2
- item3
dog:
name: 小狗
age: 3
dogs:
- {
name: 小狗, age: 3}
- {
name: 小狗2, age: 3}
3. 定义配置信息类
PiggPerson 类,
当我们为属性配置错误的值时,而又不希望 Spring Boot 应用启动失败,我们可以设置 ignoreInvalidFields 属性为 true (默认为 false)
@Data
@Component
@ConfigurationProperties(prefix = "pigg.person", ignoreInvalidFields = true)
public class PiggPerson {
private String name;
private Integer age;
private Boolean boss;
private Date birth;
private Map<String, Object> maps;
private List<Object> lists;
private PiggDog dog;
private List<PiggDog> dogs;
public PiggPerson() {
System.out.println("初始化了PiggPerson()");
}
}
PiggDog 类
@Data
public class PiggDog {
private String name;
private Integer age;
}
4. 测试
@Test
void getPersonInfo(){
System.out.println(person.toString());
}
正确获取到配置文件中值。
PiggPerson(name=冬哥, age=33, boss=false, birth=Tue Dec 26 00:00:00 CST 1989, maps={
k1=v1, k2=v2}, lists=[item1, item2, item3], dog=PiggDog(name=小狗, age=3), dogs=[PiggDog(name=小狗, age=3), PiggDog(name=小狗2, age=3)])
二、@Value的使用
1. 配置文件
pigg:
cat:
brand: 加菲猫
price: 500
2. 用@Value获取值
可以设置默认值,在key的后面加冒号,比如下面的good属性,如果配置文件里没有配置,默认为true
@Data
@Component
public class PiggCat {
@Value("${pigg.cat.brand}")
private String brand;
@Value("${pigg.cat.price}")
private Integer price;
//没有配置默认为true
@Value("${pigg.cat.good:true}")
private Boolean good;
}
3. 测试
@Test
void getPiggCat(){
System.out.println(cat.toString());
}
输出
PiggCat(brand=加菲猫, price=500, good=true)
三、@ConfigurationProperties和@Value区别
- @ConfigurationProperties能够批量注入配置文件中的属性给bean,而@Valie只能一个个注入。
- @ConfigurationProperties支持松散绑定,而@Value不支持。
- @ConfigurationProperties不支持spEL,而@Value支持,例如#{10*20}。
- @ConfigurationProperties支持JSR303数据校验,而@Value不支持。
- @ConfigurationProperties支持复杂类型的数据注入,而@Value不支持复杂类型,例如Map