springboot-yaml配置注入
1 配置文件
springboot使用一个全局的配置文件,我们可以通过修改配置文件来修改springboot底层自动配置的默认值,配置文件名必须是 application,但可以使用以下两种不同类型
1.1 application.properties
key=value
1.2 application.yaml
key: value
2 ymal基础语法
#注意下面空格的位置,yaml语法对空格的要求非常严格
#可以注入到我们的配置类中
#普通的key-value
name: sam
#对象
student:
name: sam
age: 3
#行内写法
teacher: {name: sam,age: 3}
#数组
pets:
- cat
- dog
#行内写法
animal: [cat,dog]
说明:
- 空格要求十分严格
- 属性和值的大小写十分敏感
- 以缩进的方式来控制层级关系,只要左边对齐的一列数据都是同一层级的
3 yaml注入配置文件
下面的操作目的是要给新创建的对象使用yaml配置的方式注入属性
3.1 创建一个springboot项目
3.2 创建pojo层,并在pojo层中新建两个实体类
注意需要在类名上加上 @Component 注解
package com.lv.pojo;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class Dog {
@Value("来福")
private String name;
@Value("3")
private Integer age;
public Dog() {
}
public Dog(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
package com.lv.pojo;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import java.util.Map;
@Component
public class Person {
private String name;
private Integer age;
private Boolean happy;
private Date birth;
private Map<String,Object> map;
private List<Object> list;
private Dog dog;
public Person() {
}
public Person(String name, Integer age, Boolean happy, Date birth, Map<String, Object> map, List<Object> list, Dog dog) {
this.name = name;
this.age = age;
this.happy = happy;
this.birth = birth;
this.map = map;
this.list = list;
this.dog = dog;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Boolean getHappy() {
return happy;
}
public void setHappy(Boolean happy) {
this.happy = happy;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
public Map<String, Object> getMap() {
return map;
}
public void setMap(Map<String, Object> map) {
this.map = map;
}
public List<Object> getList() {
return list;
}
public void setList(List<Object> list) {
this.list = list;
}
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", happy=" + happy +
", birth=" + birth +
", map=" + map +
", list=" + list +
", dog=" + dog +
'}';
}
}
以上的两个实体类,Dog作为Person的一个属性,Person是我们要创建并注入属性的对象
3.3 在resources目录下新建一个文件 application.yaml
在application.yaml中写入我们需要注入的属性值,注意.这里key的值和对象的属性名必须一致,否则注入不进去,属性会为null
person:
name: sam
age: 5
happy: false
Date: 2022/02/28
map: {k1: v1,k2: v2}
list:
- code
- music
- girl
dog:
name: dog
age: 3
3.4 在要注入的实体类Person的类名上加上如下注解
这个注解是本次操作的核心,它能够将配置文件中的每一个属性的值,映射到这个组件当中.告诉springboot将本类中所有属性和配置文件中相关的配置进行绑定,参数 prefix = "person" : 将配置文件中的person下面的属性一一对应,只用这个组件时容器的组件,才能够使用容器提供的ConfigurationProperties功能.
@ConfigurationProperties(prefix = "person")
3.5 编写springboot自带的测试类
package com.lv;
import com.lv.pojo.Person;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class Springboot02ConfigApplicationTests {
@Autowired
private Person dog;
@Test
void contextLoads() {
System.out.println(dog);
}
}
3.6 启动测试类并查看控制台结果
结果:所有值都注入成功
4 使用properties文件注入属性
@PropertySource(value = "") : 加载指定的配置文件,需要在参数中指定
@ConfigurationProperties : 加载默认的全局配置文件,也就是文件名必须是application的文件
下面采用指定配置文件测试
4.1 在resources目录下新建一个pro.properties文件
name=碳治郎
4.2 修改Person实体类
删除之前的@ConfigurationProperties注解
在实体类Person的类名上添加如下注解
@PropertySource(value = "classpath:pro.properties")
在需要注入的属性上添加如下注解
//EL表达式取出配置文件的值
@Value("${name}")
private String name;
4.3 再次启动测试类,查看控制台结果
结论:name属性已成功注入
4.4注意:使用properties的方式时,为防止乱码需要在IDEA中设置
5 yaml配置文件的其它操作
包括生成uuid,随机数,和占位符
5.1 修改application.yaml
person:
name: sam${random.uuid} #生成uuid
age: ${random.int} #随机int
happy: false
Date: 2022/02/28
map: {k1: v1,k2: v2}
list:
- code
- music
- girl
hello: 嘿嘿
dog:
name: ${person.hello:other}来福 #占位符
age: 3
占位符如果不设置值,就会使用默认值,如上面的代码,如果没有给hello设置值,就会使用other
5.2 再次启动测试类,查看控制台结果
6 两种方式对比
结论:推荐使用yaml方式,如果每个业务中只需要配置文件中的某个值,可以使用一下@value