准备工作
配置文件内容
#father
father:
name: 啦啦啦啦
age: 11
isBoss: false
map:
key1: 1
key2: 2
list:
- 1
- 2
- 3
测试类
@SpringBootTest
class ReviewApplicationTests {
@Autowired
Father father;
@Test
void contextLoads() {
System.out.println(father);
}
}
@ConfigurationProperties注解
ps:使用注解idea报错可以看这里
实体类
/**
* @Author: YuXinXin
* @Description: ConfigurationProperties将配置文件中的对应属性值映射到这个组件类中进行11绑定
* prefix = "father":配置文件中的前缀为father
* @Date:Created in 13:20 2020/8/1
**/
@Data
@Component
@ConfigurationProperties(prefix = "father")
public class Father {
private String name;
private Integer age;
private Boolean isBoss;
private Map map;
private List list;
}
测试结果
@Value注解
实体类
@Data
@Component
public class Father {
@Value("${father.name}")
private String name;
@Value("#{60}")
private Integer age;
@Value("true")
private Boolean isBoss;
private Map map;
private List list;
}
测试结果
两者的对比
@ConfigurationProperties | @Value | |
---|---|---|
实现功能 | 批量注入配置文件的属性值 | 一个一个指定 |
松散语法 | 支持 | 不支持 |
spring表达式 | 不支持 | 支持 |
复杂类型封装 | 支持 | 不支持 |
数据校验 | 支持 | 不支持 |
一些解释
松散语法:@Value 注解要求配置文件属性和实体类属性完全一致,而@ConfigurationProperties允许驼峰下划线和小短线的多种格式转换(如p-name,p_name,pName)
复杂类型封装:@Value仅能实现简单类型的封装,而@ConfigurationProperties可以实现复杂类型的封装,包括list map 和java类等
数据校验 :读取配置文件时候可以使用@Validated注解标注实体类,然后在属性上使用验证注解验证,但是@Value不会去走验证注解
对比结果
若只是在某个业务逻辑中获取配置文件中的某个属性值,则使用@Value;
若专门编写了一个javaBean与配置文件进行映射,则使用@ConfigurationProperties。