引言
首先,YAML并不是仅仅可以使用在Java项目中,它是一种类似于json结构的标记语言,可以为所有的编程语言服务。它强调更直观的层级表示,比较适合描述配置文件中的层级关系。
Spring Boot可以识别后缀名为".properties"或“.yaml”或“.yml” 的全局配置文件。以yaml或yml为后缀的配置文件都是YAML文件。
默认的配置文件的优先级如下:
file:./config/
file:./ 项目根路径下
classpath:/config/
classpath:/ 项目resources文件夹下
一、与其他配置格式的比较
与其他配置文件的格式比较,yaml的表达方式既有直观突出的层级结构,同时又不会冗余重复:
.properties配置方式:
.xml配置方式:
.yml配置方式:
不难看出,兼顾层级结构而又简洁明快的配置方式当然YAML是最好的选择。
二、YAML基本语法
2.1 表达式
YAML用一个键值对来表示每个属性(大小写敏感),类似于json但却不需要大括号,用冒号分割Key和Value的同时需要在冒号后面加入一个强制的空格:
key: value
举例:
2.2 层级表示
YAML采用换行并缩进的方式来表达父节点与子节点、对象与属性之间的关系,同级的节点或属性要严格保证相同的缩进:
2.3 字面量的表示
字面量包括数字、字符串、布尔值等,YAML中可以直接书写字面量,而且一般的字符串不需要加任何引号。而引号的使用一般与特殊字符有关:双引号不会转义特殊字符;单引号会转义特殊字符。比如字符串中包含 \n ,双引号识别为换行,单引号会识别为 \n 。
2.4 对象的表示
YAML为对象的表示提供了两种表达方式:层级缩进、行内表达。
层级缩进如2.2所示只需要缩进保持对齐,就可以完整的表达一个对象。另一种行内表达的方式如下:
和JSON结构体类似,不过需要注意强制空格,和不加引号。
2.5 数组或List
同样有两种写法:层级缩进和行内表达。
层级缩进的方式,因为属性的值是多个,所以与一般的属性定义略有不同,每个元素换行缩进之后需要在前面加一个短横线 - ,然后强制空格:
行内表达的方式,注意是中括号 [ ] :
2.6 Map
使用@Value可以实现注入:
@Value("#{${cache.studentAge:null}}")
private Map<String, Integer> studentAge;
cache:studentAge: "{morty : 28}"
注意,map需要用引号将整个结构括起来。我们可以在@Value 中加入默认值 null,这样可以避免在没有配置属性的时候报错,但是一定要记得在程序中判空。
三、获取配置文件(不限于YAML)中的值
Spring Boot默认使用SnakeYAML解析YAML文件。
使用配置文件的时候,除了修改Spring Boot提供的默认配置以外(如修改端口),我们还可以在配置文件中定义完全属于自己的对象,比如一个全局唯一的管理员对象。
Administrator: name: Mortyage: nullgender: MALErole: adminpermission: all
定义JavaBean,并使用注解@ConfigurationProperties。
测试:
@RunWith(SpringRunner.class)
@SpringBootTest
public class AdminTest {@Autowiredprivate Admin admin;@Testpublic void test() {System.out.println("管理员:" + admin);}
}
执行结果:
另外,除了@ConfigurationProperties注解之外,单独取得某个值还可以使用@Value,它们之间的区别:
关于@ConfigurationProperties和@Value 两个注解之间详细的区别,参考《Spring Boot————@ConfigurationProperties与@Value》。
当然,业务开发中采用在配置文件中定义实体bean的方式是比较愚蠢的。所以,在大多数应用开发场景中,@Value要比@ConfigurationProperties注解用途更广。然而在Spring Boot的自动配置原理中(参见《Spring Boot面试杀手锏————自动配置原理》),Spring Boot就是使用@ConfigurationProperties完成从配置文件到XxxxProperties对象的映射绑定的,因此,理解这种批量导入属性的方式是有必要的。
综上,就是关于YAML配置文件语法的简单讲解和Spring Boot从配置文件中的取值方式,欢迎各位看官文末留言。