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
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!