SpringBoot yaml配置注入
yaml配置注入
yaml, 也有人写为yml, 读音(鸭买哦) 官方格式为yaml
YAML(/ˈjæməl/,尾音类似camel骆驼)是一个可读性高,用来表达数据序列化的格式。YAML参考了其他多种语言,包括:C语言、Python、Perl,并从XML、电子邮件的数据格式(RFC 2822)中获得灵感。Clark Evans在2001年首次发表了这种语言,另外Ingy döt Net与Oren Ben-Kiki也是这语言的共同设计者。当前已经有数种编程语言或脚本语言支持(或者说解析)这种语言。这种语言以数据作为中心,而不是以标记语言为重点!
配置文件优先级properties
>yaml
>yml
(文件名均为application)
在springboot中, 官方推荐使用yaml格式的配置文件来取代properties文件进行配置
-
properties文件格式:
key=value
-
yml文件格式:
key:空格value
-
他们的注释都是
#
号
配置文件可以用来修改springboot中已经配置好的默认值
和xml对比, 例如: (修改服务器端口号)
xml:
<server>
<port>8081<port>
</server>
yaml:
server:
prot: 8080
可见语法比xml更加简洁, 更加直观
yaml基础语法
语法要求非常严格, 尤其是缩进, 规则如下:
- 空格不能省略
- 以缩进来控制层级关系,只要是左边对齐的一列数据都是同一个层级的。
- 属性和值的大小写都是十分敏感的。
字面量: 普通值(数组, 布尔, 字符串)
字面量可以直接写而不需要加双引号
K: V
注意:
-
“ ” 双引号,会转义字符串里面的特殊字符 , 特殊字符会作为本身想表示的意思;
比如 :name: "123 \n 456" 输出 :123 换行 456
-
'' 单引号,不会转义特殊字符 , 特殊字符最终会变成和普通字符一样输出
比如 :name: ‘123\n 456’ 输出 :123 \n 456
对象, Map类型 (键值对)
对象和Map的格式有如下两种方式, 写法一致
o:
k1: v1
k2: v2
第一行o
是对象名或者map的变量名, 如果下面的k1, k2
想和对象或者map建立关系, 必须有缩进
例如: student对象
student:
name: 张三
age: 3
集合: 例如Map map = new HashMap();
map:
k1: v1
k2: v2
即最终map中会出现两个键值对
当然, 对象和map集合还有一种行内的写法, 如下:
student: {name: zhangsan, age: 3}
map: {k1: v1, k2: v2}
数组 (list and set)
用 -
(减号)值表示数组中的一个元素,比如:
pets:
- cat
- dog
- pig
行内写法:
pets: [cat,dog,pig]
yaml注入案例
1.新建person类:
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
@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;
}
@Component
注解是把person对象交给spring管理
@ConfigurationProperties(prefix = "person")
次注解是注入配置文件(application.properties)中的对象, prefix为指定的对象
@ConfigurationProperties作用:
将配置文件中配置的每一个属性的值,映射到这个组件中;
告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定参数
prefix = “person” : 将配置文件中的person下面的所有属性一一对应
2. yaml文件内容:
person:
name: 张pk
age: 21
happy: false
birth: 1999/01/01
maps: {k1: v1, k2: v2}
lists:
- code
- girl
- music
dog:
name: 旺财
age: 5
3. 出现提示:
IDEA 提示,springboot配置注解处理器没有找到,让我们看文档,我们可以查看文档,找到一个依赖!
根据提示, 打开对象的网站, 上面说需要导入一个依赖
<!-- 导入配置文件处理器,配置文件进行绑定就会有提示,需要重启 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
4. 测试
@SpringBootTest
public class MyTest2 {
@Autowired
private Person person;
@Test
void test2() {
System.out.println(person);
}
}
结果:
Person(name=张pk, age=21, happy=false, birth=Fri Jan 01 00:00:00 CST 1999, maps={k1=v1, k2=v2}, lists=[code, girl, music], dog=Dog(name=旺财, age=5))
正常输出
加载指定配置文件
@PropertySource :加载指定的配置文件;
@configurationProperties:默认从全局配置文件(application)中获取值;
读取其他yaml文件
读取其他文件 (yaml)
1. 新建配置文件
我们去在resources目录下新建一个student.yaml
文件
student:
name: 李四
age: 45
sex: 男
2. 加载配置文件(student类)
@Data
@AllArgsConstructor
@NoArgsConstructor
@PropertySource("classpath:student.yaml")
@Component
public class Student {
@Value("${name}")
private String name;
@Value("${age}")
private Integer age;
@Value("${sex}")
private String sex; // 性别
}
测试并结果正常输出
读取其他properties文件
读取其他文件 (properties)
1. 新建配置文件
student.properties
文件
student.name=李四
student.age=45
student.sex=男
2. 加载配置文件(student类)
@Data
@AllArgsConstructor
@NoArgsConstructor
@PropertySource("classpath:student.properties")
@Component
public class Student {
@Value("${student.name}")
private String name;
@Value("${student.age}")
private Integer age;
@Value("${student.sex}")
private String sex; // 性别
}
读取其他文件对比
读取yaml的时候不需要写对象名字student
读取properties的时候必须写全key的名字才可以
配置文件占位符
例如:
person:
...
age: 21
...
son:
uuid: UUID:${random.uuid} # 随机的uuid
randomInt: ${random.int(8)} #随机数, 最大值为8, 也可以写${random.int}
randomLong: ${random.long(3)} # 随机long值, 也可以写${random.long}
other: ${person.age:other}_其他值 # 如果有person的age对象, 结果就是[对象值+_其他值], 如果没有就是[other_其他值]
Son类:
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
@ConfigurationProperties(prefix = "son")
public class Son {
private String uuid;
private Integer randomInt;
private Long randomLong;
private String other;
}
结果:
Son(uuid=UUID:518d1151-4154-479b-926f-040b86a00cf3, randomInt=6, randomLong=2.0, other=21_其他值)
扩展: springboot读取配置文件
yml(同properties)
前提都得是spring的默认配置文件(文件名为application)
配置文件
# application.yml
jdbc:
username: root
password: root
直接使用@Value
注解
@RestController
public class JDBCController {
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
}
批量赋值
批量赋值即不需要我们使用@Value
注解一个一个对属性进行指定
需要引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
例如配置文件
# application.yml
jdbc:
username: root
password: root
使用@ConfigurationProperties
注解
类, (前提已交给spring管理)
为属性赋值时, 一定会调用属性的set方法
@RestController
@ConfigurationProperties(prefix = "jdbc") // 配置前缀, 类属性与配置文件中去掉前缀的属性名一致
public class JDBCController2 {
// 批量为属性赋值时, 要求配置文件的属性与类中的属性名称一致
private String username;
private String password;
// getter, setter...
}
指定其他配置文件
其他配置文件(例如: jdbc.properties)
# jdbc.properties
jdbc.username=root
jdbc.password=root
使用@PropertySource
注解, 引入指定配置文件
@PropertySource("classpath:/jdbc.properties")
@RestController
public class JDBCController {
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
}
yml无需担心乱码问题.
注意读取配置文件中的中文会出现乱码, 需要在@PropertySource
注解中加入encoding属性, 使读取文件的时候使用utf-8的格式读取文件, (前提是properties的编码也为utf-8), 如下:
@PropertySource(value = "classpath:/properties/jdbc.properties", encoding = "UTF-8")