yaml注入配置文件
- 1、在springboot项目中的resources目录下新建一个文件 application.yml
- 2、编写一个实体类 Dog;
@Component //注册bean到容器中
public class Dog {
private String name;
private Integer age;
//有参无参构造、get、set方法、toString()方法
}
- 3、我们原来给bean注入属性值是使用@Value,给Dog类测试一下:
@Component //注册bean
public class Dog {
@Value("小白")
private String name;
@Value("18")
private Integer age;
}
- 4、在SpringBoot的测试类下注入狗狗输出一下;
@SpringBootTest
class SpringBootYaml01ApplicationTests {
@Autowired//自动注入实体类
private Dog dog;
@Test
void contextLoads() {
System.out.println(dog);//打印对象
}
}
结果成功输出,@Value注入成功,这是我们原来的办法对吧。
- 5 .我们在编写一个复杂一点的实体类:person类
@Component//注册bean到容器里面
public class Person {
private String name;
private Integer age;
private Boolean happy;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
/*写好有参无参构造,get()set() 方法以及toString()方法*/
- 6、使用yaml配置的方式进行注入
person:
name: 小白
age: 19
happy: true
birth: 2020/1/1
maps: {k1: v1,k2: v2}
lists:
-code
-dog
-cat
dog:
name: 小黄
age: 2
- 7、我们刚才已经把person这个对象的所有值都写好了,我们现在来注入到我们的类中!
/*
@ConfigurationProperties作用:
将配置文件中配置的每一个属性的值,映射到这个组件中;
告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
参数 prefix = “person” : 将配置文件中的person下面的所有属性一一对应
*/
@Component //注册bean
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private Integer age;
private Boolean happy;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
}
会出现爆红:
解决方法:导入依赖
<!-- 导入配置文件处理器,配置文件进行绑定就会有提示,需要重启 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
- 9、确认以上配置都OK之后,我们去测试类中测试一下:
@SpringBootTest
class DemoApplicationTests {
@Autowired
Person person; //将person自动注入进来
@Test
public void contextLoads() {
System.out.println(person); //打印person信息
}
}
测试成功
拓展
- 加载指定的配置文件
@PropertySource :加载指定的配置文件;
@configurationProperties:默认从全局配置文件中获取值;
1、我们去在resources目录下新建一个person.properties文件
name=honghong
2、然后在我们的代码中指定加载person.properties文件
@PropertySource(value = "classpath:person.properties")
@Component //注册bean
public class Person {
@Value("${name}")
private String name;
......
}
测试:
- 配置文件占位符
配置文件还可以编写占位符生成随机数
person:
name: 小白${random.uuid}
age: ${random.int}
happy: true
birth: 2020/1/1
maps: {k1: v1,k2: v2}
lists:
-code
-dog
-cat
dog:
name: 小黄_${person.age}
age: 2
【注意】properties配置文件在写中文的时候,会有乱码 , 我们需要去IDEA中设置编码格式为UTF-8;
settings–>FileEncodings 中配置;
properties与yaml对比小结:
1、@ConfigurationProperties只需要写一次即可 , @Value则需要每个字段都添加
2、松散绑定:这个什么意思呢? 比如我的yml中写的last-name,这个和lastName是一样的, - 后面跟着的字母默认是大写的。这就是松散绑定。可以测试一下
3、JSR303数据校验 , 这个就是我们可以在字段是增加一层过滤器验证 , 可以保证数据的合法性
4、复杂类型封装,yml中可以封装对象 , 使用value就不支持
结论:
配置yml和配置properties都可以获取到值 , 强烈推荐 yml;
如果我们在某个业务中,只需要获取配置文件中的某个值,可以使用一下 @value;
如果说,我们专门编写了一个JavaBean来和配置文件进行一一映射,就直接@configurationProperties,不要犹豫!