什么是yaml
yaml通俗来讲就是一种符合某种规范的数据的格式,类似xml、json,因为springboot的核心是自动装配,因此可以自动识别配置文件中特定格式的配置,而yaml相比于properties配置清晰而优点众多,因此springboot推荐使用yaml来进行配置。
yaml语法规范
以下我们用一个实体类来做示范来说明yaml的语法规范
- 创建实体类Dog(偷懒使用lombok),添加@Component注解说明。
lombok传送门
@Component
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Dog {
private String name;
private int age;
}
- 创建Person类,添加@Component注解说明,使用@ConfigurationProperties(prefix = “person”)绑定对应的yaml配置装配的类。
@Data
@NoArgsConstructor
@AllArgsConstructor
@Component
@ConfigurationProperties(prefix = "person") //绑定yaml
@Validated //数据校验
public class Person {
private String name;
private int age;
private Boolean marry;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
}
- 使用yaml给Person类赋值。
person:
name: 小明
age: 3
marry: false
birth: 2020/06/21
maps: {k1: v1,k2: v2}
lists:
- 唱歌
- 跳舞
- rap
dog:
name: 旺财
age: 1
- 使用@Autowired自动装配并测试
@SpringBootTest
class Springboot02ConfigApplicationTests {
@Autowired
private Person person;
@Test
void contextLoads() {
System.out.println(person);
}
}
结果输出:
Person(name=小明, age=3, marry=false, birth=Sun Jun 21 00:00:00 CST 2020, maps={k1=v1, k2=v2}, lists=[唱歌, 跳舞, rap], dog=Dog(name=旺财, age=1))
JSR303校验
根据上面示例在类上面添加@Validated 注解用来数据校验,则可以在对应的成员变量上添加一些条件来限制注入的值。
常用注解:
配置文件优先级
springboot中很多地方都可以创建配置文件并且生效,他们之间的优先级为:
- file:./config/ (当前项目路径config目录下);
- file:./ (当前项目路径下);
- classpath:/config/ (类路径config目录下);
- classpath:/ (类路径config下).
而创建项目时默认的配置为配置优先级最低的classpath:/(resources/application.*),任何地方增加配置文件均可覆盖默认配置。
多文件配置与yaml设置
在yaml中也可以分文档,只需要使用 - - - 则可以配置不同环境的参数,使用spring.profiles命名,不使用为默认,需要更换环境只需要使用spring.profiles.active进行激活即可。
例如不同环境配置不同端口,application.yaml配置如下:
spring:
profiles:
active: test
---
server:
port: 8081
---
server:
port: 8082
spring:
profiles: dev
---
server:
port: 8083
spring:
profiles: test
只需要使用active激活对应配置,即可动态修改配置。