之前写代码的时候,用的配置文件都是properties。虽然也用过yml,但由于项目组的使用习惯,所以一直没怎么用yml。
今天开始学习Spring Boot,看到自己找的开源项目中用的是yml,所以还是找资料仔细学习一下。
概念
YAML (YAML Ain’t a Markup Language)YAML不是一种标记语言,通常以.yml为后缀的文件,是一种直观的能够被电脑识别的数据序列化格式,并且容易被人类阅读,容易和脚本语言交互的,可以被支持YAML库的不同的编程语言程序导入,一种专门用来写配置文件的语言。可用于如: Java,C/C++, Ruby, Python, Perl, C#, PHP等。
优点
- 结构清晰,容易阅读;
- 可以移植性好
语法
YAML 支持以下几种数据类型:
对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
纯量(scalars):单个的、不可再分的值
-
结构:
k:v 键值对格式,冒号后面要加一个空格;
通过空格缩减(不允许使用tab),同一列位置的字段为同一层级;
大小写敏感;
#后接注释。 -
键值对类型;
1)字面值(字符串、数字等)
字符串默认不用加上单引号或者双绰号;单引号:不会转义特殊字符,特殊字符最终只是一个普通的字符串数据
name2: ‘woshishui \n nihao’:输出;woshishui \n nihao
双引号: 会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思。比如
name3: “woshishui \n nihao”:输出;woshishui 换行 nihao
name1: woshishui
name2: 'woshishui \t nihao'
name3: "woshishui \t nihao"
name4: ~ #使用~表示null
age: 100
flag: true
补充
boolean:
- TRUE #true,True都可以
- FALSE #false,False都可以
float:
- 3.14
- 6.8523015e+5 #可以使用科学计数法
int:
- 123
- 0b1010_0111_0100_1010_1110 #二进制表示
null:
nodeName: 'node'
parent: ~ #使用~表示null
string:
- 哈哈
- 'Hello world' #可以使用双引号或者单引号包裹特殊字符
- newline
newline2 #字符串可以拆成多行,每一行会被转化成一个空格
- 日期
正常书写即可
date:
- 2018-02-17 #日期必须使用ISO 8601格式,即yyyy-MM-dd
datetime:
- 2018-02-17T15:02:31+08:00 #时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区
- 对象(属性和值)、Map(键值对)
student:
name: xiaomi
age: 16
或
student: {name: xiaomi, age: 16}
- 数组、list、set
fruit:
- apple
- orange
- banana
或
student: [apple, orange, banana]
- 数组对象、list对象、set对象
student:
- name: xiaomi
age: 16
- name: xiaohong
age: 18
- {name: xiaoli, age: 20}
- java代码示例
java代码(省略get,set方法)
public class Student {
private String lastName;
private Integer age;
private Boolean leader;
private Date birth;
private Map<String,Object> maps;
private List<Pets> lists;
private Pets pet;
private String[] arr;
}
public class Pets {
private String name;
private Integer age;
}
对应的yml
student:
last-name: xiaomi
age: 18
leader: false
birth: 2000-01-01
maps:
k1: v1
k2: v2
lists:
- name: dog
age: 2
- name: cat
age: 4
- {name: fish, age: 1}
pets:
name: dog_pets
age: 2
- 引用
& 锚点和 * 别名,可以用来引用:
defaults: &defaults
adapter: postgres
host: localhost
development:
database: myapp_development
<<: *defaults
test:
database: myapp_test
<<: *defaults
相当于
defaults:
adapter: postgres
host: localhost
development:
database: myapp_development
adapter: postgres
host: localhost
test:
database: myapp_test
adapter: postgres
host: localhost
& 用来建立锚点(defaults),<< 表示合并到当前数据,* 用来引用锚点。
下面是另一个例子:
- &showell Steve
- Clark
- Brian
- Oren
- *showell
转为 JavaScript 代码如下:
[ 'Steve', 'Clark', 'Brian', 'Oren', 'Steve' ]
- 文档块
对于测试环境,预生产环境,生产环境可以使用不同的配置,如果只想写到一个文件中,yml与是支持的,每个块用----隔开
server:
port: 8081
spring:
profiles:
active: prod #激活生产环境文档块
---
server:
port: 8082
spring:
profiles: dev #指定开发环境文档块
---
server:
port: 8083
spring:
profiles: test #指定测试环境文档块
使用举例
Mysql和Redis数据库配置
spring:
# 数据源
datasource:
# 参考MyBatis-Plus官网
dynamic:
# 是否开启 SQL日志输出,生产环境建议关闭,有性能损耗(P6Spy通过劫持JDBC驱动,在调用实际JDBC驱动前拦截调用的目标语,达到SQL语句日志记录的目的)
p6spy: true
# 连接池
hikari:
# 连接超时ms
connection-timeout: 30000
# 最长生命时长ms
max-lifetime: 1800000
# 最大连接数
max-pool-size: 15
# 数据库连接池的最小维持连接数
min-idle: 5
# 链接测试查询
connection-test-query: select 1
#连接池名称
pool-name: FebsHikariCP
# 配置默认数据源
primary: base
datasource:
# 数据源-1,名称为 base
base:
username: root
password: root
# Mysql 16 有cj,Mysql 15 没有
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/febs_base?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2b8
# 数据源-2,名称为 quartz
quartz:
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/febs_quartz?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2b8
#以上会配置一个默认库base,一个子库quartz
redis:
# Redis数据库索引(默认为 0)
database: 0
# Redis服务器地址
host: 127.0.0.1
# Redis服务器连接端口
port: 6379
# Redis 密码
password:
lettuce:
pool:
# 连接池中的最小空闲连接
min-idle: 8
# 连接池中的最大空闲连接
max-idle: 500
# 连接池最大连接数(使用负值表示没有限制)
max-active: 2000
# 连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: 10000
# 连接超时时间(毫秒)
timeout: 5000