SpringBoot的全局配置文件
SpringBoot的全局配置文件名称有两种,一种是我们比较熟悉的properties,另一种就是yaml。
yaml是什么?
YAML是一个可读性高,用来表达数据序列化的格式。YAML参考了其他多种语言,包括:C语言、Python,并从XML、电子邮件的数据格式中获得灵感。请尽可能使用.yaml
,因为官方文件扩展名是.yaml
,但是还有许多人使用未经批准的.yml
扩展名。
@ConfigurationProperties与@PropertySource
@ConfigurationProperties | @PropertySource | |
功能 | 批量注入yaml配置文件中的属性 | 通过@Value("${name}")单个绑定properties文件中的属性 |
松散绑定 | 支持 | 不支持 |
SpEL | 不支持 | 支持---> $ |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
- yaml文件暂不支持使用@PropertySource("")注解,但是支持@ConfigurationProperties(prefix = "")
- 松散绑定: yaml中写 last-name, 可以映射为Java类中驼峰命名的 lastName。' - ' 后第一个字母默认为大写
- JSR303数据校验: 给字段加一层过滤器验证,保证数据的合法性
注意:
使用@ConfigurationProperties注解时,idea会提示下面,需要导入某个依赖(不导也能运行)
Spring Boot Conf iguration Annotation Processor not configured
使用@PropertySource注解时,将idea的setting-->Editor-->File Encoding,默认编码properties设置为 UTF-8,不然可能乱码
1.编写实体类
编写Person类
( 注意:不要将方式一和方式二同时放在同一个Person类里,还有导包导org.springframework...别导错了!!! )
/*
方式一:@ConfigurationProperties(prefix = "person")
将yaml配置文件中person的每一个对应属性的值,映射到这个组件中.可以放在类或者方法上
*/
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private int age;
private Dog dog;
...省略空参构造,全参构造,get/set方法,toString方法(Alt+Insert快速重写)
}
/*
方式二:@PropertySource(value="classpath:config.properties")
路径配置有多种,可以官网细究
将properties配置文件中person的每一个对应属性的值,结合@Value("${name}")映射到这个组件中
也可以直接在@Value("")写值
*/
@Component
@PropertySource(value="classpath:application.properties")
public class Person {
@Value("${name}")
private String name;
@Value("${age}")
private int age;
//不支持复杂类型封装,@Value("${dog}")会报错
private Dog dog;
...省略空参构造,全参构造,get/set方法,toString方法(Alt+Insert快速重写)
}
编写Dog类
@Component
public class Dog {
private String name;
private int age;
...省略空参构造,全参构造,get/set方法,toString方法(Alt+Insert快速重写)
}
2.resources目录下分别编写application.properties和application.yaml配置文件
application.properties
name=JH
age=20
#由于不支持复杂类型封装,对象dog的属性就不写了
application.yaml
person:
name: jh
age: 18
dog:
name: 小黑
age: 10
3.运行test下的测试类
@SpringBootTest
class Springboot01HelloworldApplicationTests {
@Autowired
Person person;
@Test
void contextLoads() {
System.out.println(person);
}
}
打印结果:
方式一@ConfigurationProperties :
Person{name='jh', age=18, dog=Dog{name='小黑', age=10}}
方式二@PropertySource :
Person
结论:
- 配置yaml和配置properties都可获取值,但是springboot推荐使用yaml
- 如果在业务中只需要获取配置文件的值,可以使用@PropertySource(value="classpath:xxx.properties")
- 如果在需要编写一个Javabean来和配置文件进行映射,就可以使用@ConfigurationProperties(prefix = "xxx")
拓展
同时加上@ConfigurationProperties与@PropertySource
@Component
@ConfigurationProperties(prefix = "person")
@PropertySource(value="classpath:application.properties")
public class Person {
@Value("${name}")
private String name;
@Value("${age}")
private int age;
private Dog dog;
...省略空参构造,全参构造,get/set方法,toString方法(Alt+Insert快速重写)
}
再运行test下的测试类,然后发现结果是
Person{name='jh', age=18, dog=Dog{name='小黑', age=10}}
可以看出@ConfigurationProperties与@PropertySource同时使用,@ConfigurationProperties会覆盖掉@PropertySource的打印结果
所以我们应该多使用SpringBoot推荐的 yaml配置文件