从其他框架来看 我们都有自己的配置文件, hibernate有hbm,mybatis 有properties, 同样, SpringBoot 也有全局配置文件。
Springboot使用一个全局的配置文件,而且配置文件的名字是固定的。(也可以自己起,但是还要指定一下,建议使用application.xxx) 有两种
配置文件的作用 :修改SpringBoot自动配置的默认值,因为SpringBoot在底层都给我们自动配置好了。
YAML
YAML是 "YAML Ain't a Markup Language" (YAML不是一种置标语言)的递归缩写。
在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种置标语言)
YAML A Markup Language :是一个标记语言
YAML isnot Markup Language :不是一个标记语言
标记语言
以前的配置文件,大多数都是使用xml来配置;比如一个简单的端口配置,我们来对比下yaml和xml
yaml配置:
server:
prot: 8080
xml配置:
8081
xml配置很多标签,相对与yaml来说很麻烦。
基础语法:
k:(空格) v
以此来表示一对键值对(空格不能省略);以空格的缩进来控制层级关系,只要是左边对齐的一列数据都是同一个层级的。
注意 :属性和值的大小写都是十分敏感的。例子:
server:
port: 8081
path: /hello
值的写法
字面量:普通的值 [ 数字,布尔值,字符串 ]
k: v
字面量直接写在后面就可以 , 字符串默认不用加上双引号或者单引号;
“” 双引号,不会转义字符串里面的特殊字符 , 特殊字符会作为本身想表示的意思;
比如 : name: "kuang \n shen" 输出 : kuang 换行 shen
'' 单引号,会转义特殊字符 , 特殊字符最终会变成和普通字符一样输出
比如 : name: ‘kuang \n shen’ 输出 : kuang \n shen
对象、Map(键值对)
k:
v1:
v2:
在下一行来写对象的属性和值得关系,注意缩进;比如:
student:
name: qinjiang
age: 3
行内写法
student: {name: qinjiang,age: 3}
数组( List、set )
用 - 值表示数组中的一个元素,比如:
pets:
- cat
- dog
- pig
行内写法
pets: [cat,dog,pig]
1. 如果要使用properties配置文件可能导入时存在乱码现象 , 需要在IDEA中进行调整 , 我们这里直接使用yml文件 , 将默认的 application.properties后缀修改为yml ,如下
2. 导入配置文件处理器
org.springframework.boot
spring-boot-configuration-processor
true
3.在SpringBoot的主程序的同级目录下建包,只有这样,主程序才会对这些类生效 ; 在com.cc下创建pojo包,并创建Dog类,和Person类
Dog类
package com.cc.pojo;
import org.springframework.stereotype.Component;
@Component
public class Dog {
private String name;
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 +
'}';
}
}
Person类
package com.cc.pojo;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
/*
@ConfigurationProperties作用:
将配置文件中配置的每一个属性的值,映射到这个组件中;
告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
参数 prefix = “person” : 将配置文件中的person下面的所有属性一一对应
只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能
*/
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private Integer age;
private Map map;
private List
4.编写yml配置文件(注意语法结构)
person:
name: 老大
age: 3
map: {k1: v1,k2: v2}
list:
- code
- music
- girl
dog:
name: 小黑
age: 3
5.确认无误后,到测试单元中进行测试,看是否注入成功!
package com.cc;
import com.cc.pojo.Dog;
import com.cc.pojo.Person;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import javax.xml.ws.soap.Addressing;
@SpringBootTest
class Springboot02ConfigApplicationTests {
@Autowired
private Person person;
@Test
void contextLoads() {
System.out.println(person);
}
}
运行结果
配置文件除了yml还有我们之前常用的properties , 我们没有讲 , properties配置文件在写中文的时候,会有乱码 , 我们需要去IDEA中设置编码格式为UTF-8;
settings-->FileEncodings 中配置;
还有,我们的类和配置文件直接关联着 , 我们使用的是@configurationProperties的方式,还有一种方式是使用@value
@Component //注册bean
public class Person {
//直接使用@value
@Value("${person.name}") //从配置文件中取值
private String name;
@Value("#{11*2}") //#{SPEL} Spring表达式
private Integer age;
@Value("true") // 字面量
private Boolean happy;
。。。。。。
}
结果照样是可以获取到的。
这个使用起来并不友好!我们需要为每个属性单独注解赋值,比较麻烦;我们来看个功能对比图
结论: