一、环境
springboot环境中application.properties和application.yml文件都支持比较,这里使用application.yml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.zixue</groupId>
<artifactId>spring-boot-demo-01</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-boot-demo-01</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 导入配置文件处理器,配置文件进行绑定就会有提示 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
</dependencies>
二、代码
//@ConfigurationProperties(prefix = "person")
@Component
public class Person {
@Value("${person.name}")
private String name;
private boolean isBooss;
private Date birthday;
// @Value("${person.map}")
private Map map;
private List list;
private Dog dog;
@Value("#{10+20}")
private int age;
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", isBooss=" + isBooss +
", birthday=" + birthday +
", map=" + map +
", list=" + list +
", dog=" + dog +
", age=" + age +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Boolean getBooss() {
return isBooss;
}
public void setBooss(Boolean booss) {
isBooss = booss;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Map getMap() {
return map;
}
public void setMap(Map map) {
this.map = map;
}
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
} //dog部分就不加了,影响不大
三、application.yml文件
person:
name: 理解
isBooss: false
birthday: 2019/8/06
map:
k1: v1
k2: v2
list:
- 1
- 2
- list
dog:
name: cat
age: 1
四、@value使用场景
①使用之前必须关闭springboot提供的配置属性绑定注解@ConfigurationProperties(prefix = “person”),不然根本不是@value获取的值
支持如下:
@Value("${person.name}")
private String name;
@Value("#{10+20}") //SpEL语法( #{ } )
private int age;
报错情况如下:
@Value("${person.map}")
private Map map;
//Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'person.map' in value "${person.map}"
@Value("${person.is_booss;}") //但是支持@Value("${person.is-booss;}")
private boolean isBooss;
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'person.is_booss' in value "${person.is_booss}"
②在person类上加上@Validated带校验功能
@Email
@Value("${person.name}")
private String name;
没有反应,所以作用无效
五、@ConfigurationProperties
①使用之前必须关闭springboot提供的配置属性绑定注解@ConfigurationProperties(prefix = “person”),不然根本不是@value获取的值
支持:
@Value("#{10+20}")
private int age;
报错情况如下(如果强加如下@value):
@Value("${person.map}") //但是支持简单的@Value("${person.name}")
private Map map;
//Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'person.map' in value "${person.map}"
@Value("${person.is_booss;}") //但是支持@Value("${person.is-booss;}")
private boolean isBooss;
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'person.is_booss' in value "${person.is_booss}"
②在person类上加上@Validated带校验功能
@Email
@Value("${person.name}")
private String name;
console显示如下:
Description:
Binding to target org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'person' to com.zixue.springbootdemo.bean.Person failed:
Property: person.name
Value: 理解
Origin: class path resource [application.yml]:2:9
Reason: 不是一个合法的电子邮件地址
六、总结
对比项 | @Value | @ConfigurationProperties |
---|---|---|
作用 | 单个属性赋值 | 批量赋值整个组件 |
作用位置 | 方法、构造器、属性 | 类 |
SpEl 支持 | 支持 | 支持 |
松散语法 | 只支持(-) | 支持 |
@Validated数据校验 | 不支持 | 支持 |
复杂类型 | 不支持 | 支持 |