目录
@ConfigurationProperties 与 @Value比较
@Value(“”)介绍:
@Value(“”)介绍:用来指定bean中某一个属性的值,它的值可以是字面量,从配置文件获取的值,spel表达式
例如:
@Value("${person.last-name}")
private String lastName;
@Value("#{11*2}")
private Integer age;
@Value("true")
private Boolean boss;
配置文件做如下配置:
person.last-name=张三
@configurationProperties:
@configurationProperties:从配置文件中读取所有的属性的值;
例如:
package com.example.springboot02config.bean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* 将配置文件中配置的每一个属性的值映射到这个组件中
*@ConfigurationProperties:这个注解的作用是告诉spring boot本类中的所有属性和配置文件中的配置进行绑定;
* prefix = "person";指定与哪一个下面的属性进行映射
* 只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能
* @Component:把这个bean加入到容器中
*/
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String lastName;
private Integer age;
private Boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dogs;
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Boolean getBoss() {
return boss;
}
public void setBoss(Boolean boss) {
this.boss = boss;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
public Map<String, Object> getMaps() {
return maps;
}
public void setMaps(Map<String, Object> maps) {
this.maps = maps;
}
public List<Object> getLists() {
return lists;
}
public void setLists(List<Object> lists) {
this.lists = lists;
}
public Dog getDogs() {
return dogs;
}
public void setDogs(Dog dogs) {
this.dogs = dogs;
}
@Override
public String toString() {
final StringBuffer sb = new StringBuffer("Person{");
sb.append("lastName='").append(lastName).append('\'');
sb.append(", age=").append(age);
sb.append(", boss=").append(boss);
sb.append(", birth=").append(birth);
sb.append(", maps=").append(maps);
sb.append(", lists=").append(lists);
sb.append(", dogs=").append(dogs);
sb.append('}');
return sb.toString();
}
}
配置文件代码如下:
1.properties文件作为配置文件
#idea使用的是utf-8
#配置person的值
person.age=18
person.birth=2017/10/10
person.boss=false
person.maps.k1=v1
person.maps.k2=jiangsu
person.last-name=张三
person.lists=1,a,b,c
person.dogs.name=我是狗一号
person.dogs.age=18
2.yml文件作为配置文件
person:
lastName: zhangsan
age: 20
boss: false
birth: 2017/12/12
maps: {k1: v1,k2: v2}
lists:
- lishi
- zhaowu
dogs:
name: 小狗一号
age: 8
@ConfigurationProperties 与 @Value比较:
@ConfigurationProperties 与 @Value异同点:
相同点:首先它们都可以用来自动配置某个或者某一些属性的值
比较:
1. 从功能上进行比较,@ConfigurationProperties批量注入配置文件中的属性;而@Value需要对指定属性的值一个个去配置
2. @ConfigurationProperties支持松散绑定,@Value不支持松散绑定
例如:对如下属性进行@ConfigurationProperties配置
private String lastName;
配置文件如下(properties文件):
person.LAST_NAME=张三
person.last-name=张三
person.last_name=张三
以上三种命名的配置方均可以对属性进行赋值;
而用@Value进行标注时,只能使用和配置文件名称一样的进行标注,例如:
@Value("${person.last_name}")
private String lastName;
配置文件:
person.last_name=张三
3.@ConfigurationProperties不支持spel语法,@Value支持spel语法
@Value("#{11*2}")
private Integer age;
4. @ConfigurationProperties支持JSR303数据校验,@Value不支持数据校验
例如使用以下的@Value给属性赋值,校验不会生效:
@Value("${person.last_name}")
@Email
private String lastName;
使用@ConfigurationProperties对属性赋值,校验会生效:
package com.example.springboot02config.bean;
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;
import javax.validation.constraints.Email;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* 将配置文件中配置的每一个属性的值映射到这个组件中
*@ConfigurationProperties:这个注解的作用是告诉spring boot本类中的所有属性和配置文件中的配置进行绑定;
* prefix = "person";指定与哪一个下面的属性进行映射
* 只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能
* @Component:把这个bean加入到容器中
*/
@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {
@Email
private String lastName;
private Integer age;
private Boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dogs;
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Boolean getBoss() {
return boss;
}
public void setBoss(Boolean boss) {
this.boss = boss;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
public Map<String, Object> getMaps() {
return maps;
}
public void setMaps(Map<String, Object> maps) {
this.maps = maps;
}
public List<Object> getLists() {
return lists;
}
public void setLists(List<Object> lists) {
this.lists = lists;
}
public Dog getDogs() {
return dogs;
}
public void setDogs(Dog dogs) {
this.dogs = dogs;
}
@Override
public String toString() {
final StringBuffer sb = new StringBuffer("Person{");
sb.append("lastName='").append(lastName).append('\'');
sb.append(", age=").append(age);
sb.append(", boss=").append(boss);
sb.append(", birth=").append(birth);
sb.append(", maps=").append(maps);
sb.append(", lists=").append(lists);
sb.append(", dogs=").append(dogs);
sb.append('}');
return sb.toString();
}
}
配置文件:
person.age=18
person.birth=2017/10/10
person.boss=false
person.maps.k1=v1
person.maps.k2=jiangsu
person.last_name=张三
person.lists=1,a,b,c
person.dogs.name=我是狗一号
person.dogs.age=18
结果:变量lastName的值不符合邮箱格式执行会抛出异常
Property: person.lastName
Value: "张三"
Origin: class path resource [application.properties] - 9:18
Reason: 不是一个合法的电子邮件地址
5.@ConfigurationProperties支持复杂类型封装,@Value不支持复杂类型封装,例如Map类型就不能使用@Value进行配置