1.@Value获取值和@ConfigurationProperties获取值比较
@ConfigurationProperties | @Value | |
功能 | | 一个个指定 |
松散绑定(松散语法) | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
无论配置文件yaml还是properties他们都能获取到值;
如果说,我们在只是在某个业务中获取一下配置文件中的某项值,使用@Value;
如果说,我们专门编写了一个JavaBean和配置文件进行映射,我们就直接使用onfigurationProperties;
2.举例解释(此处以yaml文件为例)
application.yaml
server:
port: 8081
person:
lastName: 张三
age: 18
boss: true
birth: 2018/12/02
map: {k1: c,k2: z}
lists:
- zz
- bb
dog:
name: Tom
age: 12
javabean
package com.hbsi.bean;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.validation.constraints.Email;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
/*
* 将配置文件中配置的每一个属性的值,映射到这个组件
* @ConfigurationProperties:告诉SpringBoot将本类中所有属性和配置文件中相关的配置进行绑定;
* 只有这个组件是容器中的组件,才能用容器提供的@ConfigurationProperties功能
*/
@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {
//可以通过@Value获取配置文件中某一个值
@Email
private String lastName;
private Integer age;
private boolean boss;
private Date birth;
private Map<String, String> map;
private List lists;
private Dog dog;
}
(1) 松散绑定(此时用@ConfigutationPropertis)
application.yaml中的(application.propertiest同样可以用以下规则)
属性名匹配规则可以是
pseron:
lastName:使用标准方式
last_name:大写用-
last-name:大写用-
(2)支持SpEL表达式(此时用@Value)
public class Person {
private String lastName;
@Value("#{11*2}")
private Integer age;
private boolean boss;
private Date birth;
private Map<String, String> map;
private List lists;
private Dog dog;
}
(3)支持数据校验(此时用ConfigutationPropertis)
@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {
@Email//判断lastName是不是email格式
private String lastName;
private Integer age;
private boolean boss;
private Date birth;
private Map<String, String> map;
private List lists;
private Dog dog;
}
控制台输出为
Property: person.lastName
Value: 张三
Origin: class path resource [application.yml]:4:15
Reason: 不是一个合法的电子邮件地址
(4)复杂类型封装
@Configuration支持(map,list)
server:
port: 8081
person:
map: {k1: c,k2: z}
lists:
- zz
- bb
dog:
name: Tom
age: 12
@Value不支持
@Value("person.map")
private Map<String, String> map;