@ConfigurationProperties
1.支持jsr303校验
2.批量注入配置文件中的属性
3.支持松散绑定
4.支持复杂类型封装
@value
1.一个一个指定,单独注解赋值
2.不支持jsr303校验
3.不支持松散绑定
4.不支持复杂类型封装
5.支持SpEL
cp只需要写一次即可, value则需要每个字段都添加
松散绑定:这个什么意思呢?比如我的yml中写的last-name,这个和lastName是一样的,- 后面跟着的字母默认是大写的,这就是松散绑定
JSR303数据校验,这个就是我们可以在字段是增加一层过滤器验证,可以保证数据的合法性
复杂类型封装, yml中可以封装对象,使用@value就不支持
JSR303校验
Springboot中可以用@validated来校验数据,如果数据异常则会统一抛出异常,方便异常中心统一处理。我们这里来写个注解让我们的name只能支持Email格式;
@Component //注册bean
@ConfigurationProperties(prefix = "person")
@Validated //数据校验
public class Person {
@Email(message="邮箱格式错误") //name必须是邮箱格式
private String name;
}
注意jdk版本选择
package com.kuang.pojo;
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;
@Component //注册bean到容器中
@ConfigurationProperties(prefix = "person")
@Validated//数据校验
public class Person {
@Email()
//@Value("${person.name}")
private String name;
private Integer age;
private Boolean happy;
private Date birth;
private Dog dog;
private List<Object> lists;
//有参无参构造、get、set方法、toString()方法
public Person(){
}
public void setName(String name) {
this.name = name;
}
public void setAge(Integer age) {
this.age = age;
}
public void setHappy(Boolean happy) {
this.happy = happy;
}
public void setBirth(Date birth) {
this.birth = birth;
}
public void setDog(Dog dog) {
this.dog = dog;
}
public void setLists(List<Object> lists) {
this.lists = lists;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", happy=" + happy +
", birth=" + birth +
", lists=" + lists +
", dog=" + dog +
'}';
}
public Person(String name, Integer age, Boolean happy, Date birth, List<Object> lists, Dog dog) {
this.name = name;
this.age = age;
this.happy = happy;
this.birth = birth;
this.lists = lists;
this.dog = dog;
}
}
在yaml里配置则是
person:
name: qinjiang
age: ${random.int}
happy: false
birth: 2000/01/01
lists:
- code
- girl
- music
dog:
name: 旺财
age: 1
server:
port: 8888
运行结果会报错
而如果yaml配置时将姓名改成邮箱
person:
name: qinjiang@163.com
则结果就会正常显示