yml配置文件比properties配置文件更为强大,下面一 一概述
- 缩进规则:
yml配置文件的每一段都要进行缩进,一段代表一级,并且键和值之间必须得有个空格,否则spring boot会不认识你这个键,例如
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/demo
username: root
password: root
这样能让每一段都看的清清楚楚,肯定会比下面的properties好得多
spring.datasource.driVerclAssname=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/demo
spring.datasource.username=root
spring.datasource.password=root
- 松散的命名:不区分大小写,可以省略连字符等
# 松散命名,把driver的连字符去掉了,并且把Class和Name首字母变成大写
spring:
datasource:
driverClass-Name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/demo
username: root
password: root
# 正规命名
spring.datasource.driVerclAssname=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/demo
spring.datasource.username=root
spring.datasource.password=root
但如果是properties的话,会不允许这种松散命名,否则会报错。
- 嵌套对象
yml里可以嵌套一个类,但嵌套的本质是把配置文件的信息赋值给自己编写的类中,例如现在有个demo实体类
// 自动生成get set toString方法的注解
@Data
// 此前缀就是在yml配置文件里的级别最高的那一段,作用是让yml里的demo和类里的demo能够匹配
@ConfigurationProperties(prefix = "demo")
public class Demo {
private Integer id;
private String name;
}
// 这个类的字段必须有getter,setter,并且与配置文件中去掉前缀之后的名字匹配
yml配置文件
demo:
id: 1
name: admin
启动类
// 启动类注解
@SpringBootApplication
// 将Demo类注册到spring中,相当于被spring管理
@EnableConfigurationProperties(Demo.class)
public class YmlApplication implements CommandLineRunner {
@Autowired
private Demo demo;
public static void main(String[] args) {
SpringApplication.run(YmlApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
System.out.println("-----debug: demo = " + demo);
}
}
输出结果
注册的方式有两种,第一种是在启动类里加上@EnableConfigurationProperties(要注册的类,可以是数组),第二种是在要注册的类上面加上@Component,推荐第一种的原因也是因为第二种要在每个类上加注解,太过麻烦。
匹配的方式也有两种,一种是加@ConfigurationProperties(prefix = “demo”)注解,第二种是加@Value注解,推荐第一种的原因是因为第一种支持松散命名。
- 随机数
在yml里可以用${}表达式生成随机数或者其他的一些东西,但properties没有
# 表示生成20-100之间的一个整数
demo:
id: ${random.int(20,100)}
name: admin
输出结果
- 引用其他变量
不仅可以引用自己类的变量,也可以引用别的类的变量
demo:
id: ${random.int(20,100)}
name: ${demo.id} admin
输出结果
- 数组
demo:
id: ${random.int(20,100)}
name:
- xx
- aa
当然Demo类的name也要变成数组类型才行
@Data
@Component
@ConfigurationProperties(prefix = "demo")
public class Demo {
private Integer id;
private String[] name;
}
运行结果
当然也可以存集合,只是需要实体类那边更换类型,这边就不细说了。
-
键值对编写
首先在实体类中加上Map集合字段类型。
@Data
@Component
@ConfigurationProperties(prefix = "demo")
public class Demo {
private Integer id;
private String[] name;
private Map<String, Integer> scores;
}
yml配置文件
demo:
id: ${random.int(20,100)}
name:
- xx
- aa
scores:
yuwen: 10
shuxue: 20
运行结果
-
多配置文件
第一种写法:在一个配置文件中编写多个配置,用—分割
demo:
id: 8000
name: main
# 指定选用哪个配置文件
spring:
profiles:
active: production
---
spring:
profiles:
dev
demo:
id: 8080
---
spring:
profiles:
production
demo:
id: 80
一开始demo的id是8080的,name是main,但是它引用了叫producttion的配置文件,所以demo的id就会被替换成production的id
第二种写法:有多个配置文件,在主配置文件中指定使用哪一个
第二种写法大致和第一种一样,不过就是把配置分成了一个个文件。
- 引入其他配置文件
application.yml
spring:
profiles:
include: dev
application-dev.yml
demo:
id: 1
name: main
运行结果