配置文件
1.配置文件
- application.properties
- application.yml
作用:修改SpringBoot自动配置的默认值;
.yml(YAML Ain’t Markup Language)
YAML a Markup Language :是一个标记语言;
YAML Ain’t Markup Language : 不是一个标记语言;
YAML:以数据为中心,比JSON,XML等更适合做配置文件
server:
port: 8080
XML:
<server>
<port>8080</port>
</server>
properties:
server.port=8080
2.YAML基本语法
1. YAML基本语法
- 使用缩进表示层级关系
- 缩进时不允许使用空格键,只允许使用空格
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
- 大小写敏感
2. YAML支持的三种数据格式
- 对象:键值对的集合(k:(空格)v)
- 数组:一组按次序排序的值
- 字面量:单个的、不可再分的值
3. 值的写法
-
字面量:普通的值(数字,字符串,布尔)
k:(空格)v :字面直接来写:- " " : 双引号,不会转义字符串里面的特殊字符
- ’ ‘ : 单引号,会转义特殊字符
-
对象、map(属性和值):
- k: v:(对象的方式)
friends: lastName: zhangsan age: 20
行内写法:
friends: {lastName: zhangsan,age: 18}
-
数组写法(List,Set):
- 用 - 值表示数组中一个元素
pets: - cat - dog - pig
行内写法:
pets: [cat,dog,pig]
4. 使用YAML来获取值
- 首先我先创建了两个实体类来进行测试
Person类:
/**
* 将配置文件中的属性映射到这个实体类中
* @ConfigurationProperties : 告诉SptingBoot将本类中所有的属性和配置文件中相关的配置进行绑定;
* prefix : "..." : 指定配置文件的哪一个属性进行一一映射
* 只有这个实体类是个容器(@Component),才能使用容器提供的功能
*/
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String lastName;
private String age;
private Boolean flag;
private Date birthday;
private Map<String , Object> maps;
private List<Dog> list;
private Dog dog;
@Override
public String toString() {
return "Person{" +
"lastName='" + lastName + '\'' +
", age='" + age + '\'' +
", flag=" + flag +
", birthday=" + birthday +
", maps=" + maps +
", list=" + list +
", dog=" + dog +
'}';
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public Boolean getFlag() {
return flag;
}
public void setFlag(Boolean flag) {
this.flag = flag;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Map<String, Object> getMaps() {
return maps;
}
public void setMaps(Map<String, Object> maps) {
this.maps = maps;
}
public List<Dog> getList() {
return list;
}
public void setList(List<Dog> list) {
this.list = list;
}
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
}
Dog类:
public class Dog {
private String name;
private String age;
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
", age='" + age + '\'' +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
- 在YAML中配置属性的值。
person: lastName: zhangsan age: 18 flag: true birthday: 2018/11/12 maps: {k1: s1,k2: s2} list: - name: huanhuan age: 2 - name: dd age: 5 - name: keke age: 4 dog: name: kk age: 9
- 在Person类中写入注释@Component和@ConfigurationProperties(prefix = “person”),上面类中也有注释这两个是什么意思。
- 在单元测试类中编写代码,测试是否能够获取到值。
运行结果:@Autowired private Person person; @Test public void contextLoads() { System.out.println(person); }
结果显而易见,获取到啦!。
3.properties配置
重新配置Person的值
# 配置Person的值
person.last-name=张三
person.flag=true
person.age=18
person.birthday=2018/11/12
person.maps.k1=v1
person.maps.k2=v2
person.list[0].name=huanhuan
person.list[0].age=15
person.list[1].name=huanhu1an
person.list[1].age=2
person.list[2].name=huanhu2an
person.list[2].age=5
person.dog.name=dog
person.dog.age=5
4.使用@Value配置
重新配置Person的值
也可以输出值来。
5.@Value获取值和@ConfigurationProperties获取值比较
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 批量注入配置文件中的属性 | 一个个的指定配置 |
松散绑定 | 支持 | 不支持 |
SpEl | 不支持 | 支持 |
JSR303 | 支持(使用@Validated) | 不支持 |
复杂类型封装 | 支持 | 不支持 |
如果说,我们只需要在某个业务逻辑中获取配置文件的某项值,使用@Value。
如果说,我们专门编写了一个javabean来和配置文件进行映射,使用@ConfigurationProperties。