用@ConfigurationProperties注解注入值;
- 先创建Person实体类对象
public class Person {
private String Name;
private int id;
private String [] family;
private List list;//创建一个list集合
private Map map;
private Dog dog;//Dog类引用变量
public Person() {
}
public Person(String name, int id, String[] family, List list, Map map, Dog dog) {
Name = name;
this.id = id;
this.family = family;
this.list = list;
this.map = map;
this.dog = dog;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String[] getFamily() {
return family;
}
public void setFamily(String[] family) {
this.family = family;
}
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
public Map getMap() {
return map;
}
public void setMap(Map map) {
this.map = map;
}
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
@Override
public String toString() {
return "Person{" +
"Name='" + Name + '\'' +
", id=" + id +
", family=" + Arrays.toString(family) +
", list=" + list +
", map=" + map +
", dog=" + dog +
'}';
}
}
2.创建Dog实体类
public class Dog {
private String dogname;
private int ID;
public String getDogname() {
return dogname;
}
public void setDogname(String dogname) {
this.dogname = dogname;
}
public int getID() {
return ID;
}
public void setID(int ID) {
this.ID = ID;
}
@Override
public String toString() {
return "Dog{" +
"dogname='" + dogname + '\'' +
", ID=" + ID +
'}';
}
}
3.这时候我们在Springboot核心配置文件application.yml中配置了相对应的属性值
person:
Name: yangzhongliang
id: 1
family: [yangzhongliang,xiaogou,xiaozhu]
list: [shouji,diannao,shubao]
map: {k1: v1 ,k2: v2}
dog: {dogname: niuniu , ID: 2}
4.这时候如果说我们Person实例对象想要批量注入属性,就可以使用我们的
@ConfigurationProperties注解了。
只需要在Person类上加上这两行注解。把Person类创建实例对象,然后把Springboot核心配置文件中的前缀为person的属性值传入到对象的属性中。
注意:(配置文件中的属性名称一定要和对象中的属性名称一致,因为底层是通过set方法注入的)
@Component//把这个类生成实例对象加载到IOC容器中
@ConfigurationProperties(prefix = "person")//意思是把Springboot的核心配置文件中前缀为Person的值注入到该类的属性中
测试:
@Autowired
private Person person;
//我们之前学习的@Value注解是spring的
@Value("${person.Name}")//使用Spring的spel表达式,调用Springboot配置文件中的Name属性值
private String Chinaname;
@Test
public void Test1(){
System.out.println(person);
System.out.println(Chinaname);
}
输出结果:
那@ConfigurationProperties注解又与我们在Spring中学习到的@Value注解有什么区别呢?
他们的区别就在下面:
举个实例,例如JSR303校验,我们可以通过@ConfigurationProperties注解来进行一个演示:
1.我们先创建一个实体类
public class MyEmail {
private String Email;
public String getEmail() {
return Email;
}
public void setEmail(String email) {
Email = email;
}
@Override
public String toString() {
return "MyEmail{" +
"Email='" + Email + '\'' +
'}';
}
}
2.在Springboot核心配置文件中配置相对应的属性值
myemail:
email: lisi
3.这时候我们使用@ConfigurationProperties进行注入,给类上加上
@ConfigurationProperties注解。
@Component
@ConfigurationProperties(prefix = "myemail")
4.测试类:
@Autowired
private MyEmail myEmail;
@Test
public void Test2(){
System.out.println(myEmail.getEmail());
}
5.打印输出:
正常注入成功并打印在控制台,但是如果我们使用JSR303数据校验,给MyEmail类上加上@Validated注解,并给变量Email属性设置@Email注解,使变量必须注入邮箱格式的属性值。
@Component
@ConfigurationProperties(prefix = "myemail")
@Validated//JSR303数据校验注解
public class MyEmail {
@Email//使用@Email注解标注这个属性中的值必须为邮件格式
private String Email;
public String getEmail() {
return Email;
}
public void setEmail(String email) {
Email = email;
}
@Override
public String toString() {
return "MyEmail{" +
"Email='" + Email + '\'' +
'}';
}
}
这时候如果输出,会发现报错了。
如果这时候把核心配置文件中的属性值修改成邮箱格式。
myemail:
email: lisi@163.com
再次测试:
这时候成功在控制台中打印出来了。。。。。。。。。。。。。。。。。