配置文件
SpringBoot使用一个全局的配置文件,配置文件名称是固定的:
application.properties
语法结构: key = value
application.yaml
* 语法结构: key:空格
value
yaml概述
YAML是 “YAML Ain’t a Markup Language” (YAML不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:“Yet Another Markup Language”(仍是一种标记语言)
这种语言以数据作为中心,而不是以标记语言为重点!
以前的配置文件,大多数都是使用xml来配置;比如一个简单的端口配置,我们来对比下
yaml
和xml
传统的xml配置
<server>
<port>8081<port>
</server>
yaml配置
server:
prot: 8080
yaml基础语法
语法要求严格
说明:语法要求严格
1、空格不能省略
2、以缩进来控制层级关系,只要是左边对齐的一列数据都是同一个层级的。
3、属性和值的大小写都是十分敏感的。
字面量: 普通的值 [数字,布尔值,字符串]
普通的key-value
# 普通的key-value
name: qinjiang
对象、map(Object)
# 对象
student:
name: qinjiang
age: 13
数组(List、set)
用
-值
表示数组中的一个元素,比如:
pets:
- cat
- dog
- pig
行内写法
pets: [cat,dog,pig]
修改SpringBoot的默认端口号
配置文件中添加,端口号的参数,就可以切换端口;
server:
port: 8082
注入配置文件分析
yaml文件更强大的地方在于,它可以给我们的实体类直接注入匹配值!
编写一个pojo类
package com.example.demo.pojo;
import com.sun.org.apache.xpath.internal.operations.Bool;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
* @Author Zhou jian
* @Date 2020 ${month} 2020/5/7 0007 01:31
*/
@Component//注册bean到容器中
public class Person {
private String name;
private Integer age;
private Dog dog;
private Date date;
private Boolean happy;
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 Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public Boolean getHappy() {
return happy;
}
public void setHappy(Boolean happy) {
this.happy = happy;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", dog=" + dog +
", date=" + date +
", happy=" + happy +
'}';
}
public Person() {
}
public Person(String name, Integer age, Dog dog, Date date, Boolean happy) {
this.name = name;
this.age = age;
this.dog = dog;
this.date = date;
this.happy = happy;
}
}
使用yaml配置的方式进行注入
person:
name: zhoujian
age: 18
date: 2020/4/5
happy: true
dog:
name: 旺财
age: 100
注入到类中
/*
@ConfigurationProperties作用:
将配置文件中配置的每一个属性的值,映射到这个组件中;
告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
参数 prefix = “person” : 将配置文件中的person下面的所有属性一一对应
*/
@Component //注册bean
@ConfigurationProperties(prefix = "person")
测试
package com.example.demo;
import com.example.demo.pojo.Dog;
import com.example.demo.pojo.Person;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class DemoApplicationTests {
@Autowired
Dog dog;
@Autowired
Person person;
@Test
void contextLoads() {
System.out.println(dog);
System.out.println(person);
}
}
对比@Value和@ConfigurationProperties
@Value这个使用起来并不友好!我们需要为每个属性单独注解赋值,比较麻烦;我们来看个功能对比图
1、@ConfigurationProperties只需要写一次即可 , @Value则需要每个字段都添加
2、松散绑定:这个什么意思呢? 比如我的yml中写的last-name,这个和lastName是一样的, - 后面跟着的字母默认是大写的。这就是松散绑定。可以测试一下
3、JSR303数据校验 , 这个就是我们可以在字段是增加一层过滤器验证 , 可以保证数据的合法性
4、复杂类型封装,yml中可以封装对象 , 使用value就不支持
结论:
-
配置yml和配置properties都可以获取到值 , 强烈推荐 yml;
-
如果我们在某个业务中,只需要获取配置文件中的某个值,可以使用一下 @value;
-
如果说,我们专门编写了一个
JavaBean
来和配置文件进行一一映射,就直接@ConfigurationProperties
,不要犹豫!