@ConfigurationProperties | @Value | |
---|---|---|
功能 | 批量注入配置文件中的属性 | 一个个指定 |
松散绑定(松散语法 | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
所谓松散语法(Relaxed binding)
person.firstName:使用标准方式 –
person.first-name:大写用–
person.first_name:大写用_
– PERSON_FIRST_NAME:
• 推荐系统属性使用这种写法
举个例子:
使用松散语法对@Value进行操作
#配置person的值
person.last-name=张三
person.age=18
@Value("${person.lastName}")//Spring 的底层注解
//@Email//lastname必须是邮箱格式
private String lastName;
@Value("${person.last-name}")
换成这样才正确
什么时候用@ConfigurationProperties 或者@Value
配置文件yml还是properties他们都能获取到值;
如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value;
如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties;
**例如使用@value来获取一个值**
@RestController
public class HelloController {
@Value("${person.last-name}")//使用@value来获取一个值
private String name;
@RequestMapping("/sayHello")
public String sayHello(){
return "Hello"+name;
}
}
配置文件注入值数据校验
/*将配置文件中的每一个属性的值映射到这个组件中
@ConfigurationProperties:告诉SpringBoot将本类的所有属性和配置文件中
相关的配置进行绑定,其中 prefix 属性就是告诉
application.yml中对应的是Person类 。
(配置文件中哪个下面的所有属性进行一一映射)
只有这个组件是容器里面的组件,才能容器提供的@ConfigurationProperties功能
*/
@Component
@ConfigurationProperties(prefix = "person")
public class person {
/**
* 类似于这种配置功能的方式
* <bean>
* <property name="lastname" value="字面量/${key}从环境变量,配置文件中获取值/#{SpEL}"
*
* </property>
* 此value跟这个注解 @Value("")功能是一样的
* </bean>
*/
//@Value("${person.last-name}")//Spring 的底层注解
//@Email//lastname必须是邮箱格式
private String lastName;
//@Value("#{11*2}")
private Integer age;
//@Value("true")
private boolean boss;
private Date birth;
private Map<String,Object>maps;
private List<Object>lists;
private Dog dog;