在接触springboot的时候遇到了一种特殊的配置文件 .yml,本文对yml作简单介绍,快速入手yml。 一、YML是什么YAML (YAML Ain't a Markup Language)YAML不是一种标记语言,通常以.yml为后缀的文件,是一种直观的能够被电脑识别的数据序列化格式,并且容易被人类阅读,容易和脚本语言交互的,可以被支持YAML库的不同的编程语言程序导入,一种专门用来写配置文件的语言。可用于如: Java,C/C++, Ruby, Python, Perl, C#, PHP等。 二、YML的优点
三、YML语法1.约定
2.键值关系 (以java语言为例,其它语言类似)对于键与值主要是看能否表示以下内容。普通的值(数字、字符串、布尔)、日期、对象、数组、集合等。 1) 普通值(字面量) k: v:字面量直接写; 字符串默认不用加上单引号或者双绰号; "": 双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思 name: "zhangsan \n lisi":输出;zhangsan 换行 lisi '':单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据 name1: zhangsanname2: 'zhangsan \n lisi'name3: "zhangsan \n lisi"age: 18flag: true 2)日期 date: 2019/01/01 3)对象(属性和值)、Map(键值对) 在下一行来写对象的属性和值的关系,注意缩进 people:name: zhangsanage: 20 行内写法: people: {name:zhangsan,age: 20} 4)数组、list、set 用- 值表示数组中的一个元素 pets:- dog- pig- cat 行内写法 pets: [dog,pig,cat] 5)数组对象、list对象、set对象 peoples:- name: zhangsanage: 22- name: lisiage: 20- {name: wangwu,age: 18} 6)java代码示例 java代码(省略get,set方法) public class Person {private String lastName;private Integer age;private Boolean boss;private Date birth;private Map<String,Object> maps;private List<Dog> lists;private Dog dog;private String[] arr;}public class Dog {private String name;private Integer age;} 对应的yml person:boss: falsemaps:k1: v1k2: 14lists:- name: d1age: 2- name: d2age: 3- {name: d3,age: 4}birth: 2017/12/15dog:name: p_dogage: 15age: 13last-name: 张三arr: [s1,s2,s3] @Value 获取值和 @ConfigurationProperties 获取值的比较:
3.文档块 对于测试环境,预生产环境,生产环境可以使用不同的配置 [ config.dev.yml、config.prod.yml、config.test.yml] 如果只想写到一个文件中,yml与是支持的,每个块用----隔开 server:port: 8081spring:profiles:active: prod #激活对应的文档块---server:port: 8083spring:profiles: dev #指定属于哪个环境---server:port: 8084spring:profiles: prod #指定属于哪个环境 #################################### 简单的文件 ########################################## 数据结构可以用类似大纲的缩进方式呈现 receipt: Oz-Ware Purchase Invoicedate: 2012-08-06customer:given: Dorothyfamily: Galeitems:- part_no: A4786descrip: Water Bucket (Filled)price: 1.47quantity: 4- part_no: E1628descrip: High Heeled "Ruby" Slipperssize: 8price: 133.7quantity: 1bill-to: &id001street: |123 Tornado AlleySuite 16city: East Centervillestate: KSship-to: *id001specialDelivery: >Follow the Yellow BrickRoad to the Emerald City.Pay no attention to theman behind the curtain. 注意在 YAML 中,字符串不一定要用双引号标示。另外,在缩进中空白字符的数目并不是非常重要,只要相同层次结构的元素左侧对齐就可以了(不过不能使用 TAB 字符)。这个文件的顶层由七个键值组成:其中一个键值 "items",是两个元素构成的数组(或称清单),这清单中的两个元素同时也是包含了四个键值的散列表。文件中重复的部分用这个方法处理:使用锚点( &)和引用(*)标签将 "bill-to" 散列表的内容复制到 "ship-to" 散列表。也可以在文件中加入选择性的空行,以增加可读性。在一个文件中,可同时包含多个文件,并用 "---"分隔。选择性的符号"..." 可以用来表示文件结尾(在利用流的通信中,这非常有用,可以在不关闭流的情况下,发送结束信号)。 语言的构成元素YAML 的基本组件 YAML 提供缩进/区块以及内置(inline)两种格式,来表示清单和散列表。以下展示几种 YAML 的基本原件。 清单(数组) --- # 最喜爱的电影- Casablanca- North by Northwest- Notorious 另外还有一种内置格式(inline format)可以选择──用方括号围住,并用逗号 + 空白区隔(类似 JSON 的语法) --- # 购物清单[milk, pumpkin pie, eggs, juice] 散列表 键值和数据由冒号及空白字符分开。区块形式(常使用与 YAML 数据文档中)使用缩进和换行符分隔 key: value 对。内置形式(常使用与 YAML 数据流中)在大括号中使用逗号 + 空白字符分隔 key: value 对。 --- # 區塊形式name: John Smithage: 33--- # 內置形式{name: John Smith, age: 33} 区块的字符 再次强调,字符串不需要包在引号之内。有两种方法书写多行文字(multi-line strings),一种可以保存新行(使用 | 字符),另一种可以折叠新行(使用 > 字符)。 保存新行 (Newlines preserved) data: | # 譯者注:這是一首著名的五行民謠(limerick)There once was a man from Darjeeling # 這裡曾有一個人來自大吉嶺Who got on a bus bound for Ealing # 他搭上一班往伊靈的公車It said on the door # 門上這麼說的"Please don't spit on the floor" # "請勿在地上吐痰"So he carefully spat on the ceiling # 所以他小心翼翼的吐在天花板上 根据设置,前方的引领空白符号(leading white space)必须排成条状,以便和其他数据或是行为(如示例中的缩进)明显区分。 折叠新行 (Newlines folded) data: >Wrapped text # 摺疊的文字will be folded # 將會被收into a single # 進單一一個paragraph # 段落Blank lines denote # 空白的行代表paragraph breaks # 段落之間的區隔 和保存新行不同的是,换行字符会被转换成空白字符。而引领空白字符则会被自动消去。 层次结构化的元素 于清单中使用散列表 - {name: John Smith, age: 33}- name: Mary Smithage: 27 于散列表中使用清单 men: [John Smith, Bill Jones]women:- Mary Smith- Susan Williams YAML 的高级组件这部分算是一个后续的讨论,在比较各种数数据列语言时,YAML 最常被提到的特色有两个:关系树和数据形态。 树状结构之间的交互引用 数据合并和参考 为了维持文件的简洁,并避免数据输入的错误,YAML 提供了结点参考(*)和散列合并(<<)参考到其他结点标签的锚点标记(&)。参考会将树状结构加入锚点标记的内容,并可以在所有数据结构中运作(可以参考上面 "ship-to" 的示例)合并只有散列表可以使用,可以将键值自锚点标记复制到指定的散列表中。 当数据被 instantiate 合并和参考会被剖析器自动展开。 #眼部雷射手術之標準程序---- step: &id001 # 定義錨點標籤 &id001instrument: Lasik 2000pulseEnergy: 5.4pulseDuration: 12repetition: 1000spotSize: 1mm- step:<<: *id001 # 合併鍵值:使用在錨點標籤定義的內容spotSize: 2mm # 覆寫"spotSize"鍵值- step:<<: *id001 # 合併鍵值:使用在錨點標籤定義的內容pulseEnergy: 500.0 # 覆寫鍵值alert: > # 加入其他鍵值warn patient ofaudible pop 数据形态 由于自动判定数据形态的功能,严格类型(也就是用户有宣告的数据形态)很难在大部分的 YAML 文件中看到。数据类型可以被区分成三大类:原码(core),定义(defined),用户定义(user-defined)。原码可以自动被解析器分析(例如:浮点数,整数,字符串,清单,映射,...)。有一些高级的数据形态──例如比特数据──在 YAML 中有被 “定义”,但不是每一种解析器都有支持。最后,YAML 支持用户自定的区域变量,包括:自定义的类别,结构或基本类型(例如:四倍精度的浮点数)。 强制转型 YAML 的自动判定数据形态是哪一种实体。但有时用户会想要将数据强制转型成自定的某种类型。最常见的状况是字符串,有时候可能看起来像数字或布尔值,这种时候可以使用双引号,或是使用严格类型标签。 ---a: 123 # 整數b: "123" # 字串(使用雙括號)c: 123.0 # 浮點數d: !!float 123 # 浮點數,使用!!表達的嚴格型態e: !!str 123 # 字串,使用嚴格型態f: !!str Yes # 字串,使用嚴格型態g: Yes # 布林值"真"h: Yes we have No bananas # 字串(包含"Yes"和"No") 其他特殊数据形态 除了一般的数据形态之外,用户也可以使用一些较为高级的类型,但不保证可被每种解析器分析。使用时和强制转型类似,要在形态名称之前加上两个惊叹号(!!)。有几种重要的形态在本篇没有讨论,包括集合(sets),有序映照(ordered maps),时间戳记(timestamps)以及十六进制数据(hexadecimal)。下面这个示例则是比特数据(binary) ---picture: !!binary |R0lGODlhDAAMAIQAAP//9/X17unp5WZmZgAAAOfn515eXvPz7Y6OjuDg4J+fn5OTk6enp56enmleECcgggoBADs=mZmE 用户自行扩展的数据形态 许多 YAML 的实现允许用户自定义数据形态。在将一个对象序列化时,这个方法还颇方便的。某些区域数据形态可能不存在默认的数据形态中,不过这种类型在特定的 YAML 应用程序中是有定义的。这种区域数据形态用惊叹号( !)表示。 myObject: !myClass { name: Joe, age: 15} 语法在 yaml.org(英文)可以找到轻巧而好用的 小抄(亦是用 YAML 表示)及格式说明。下面的内容,是关于基本组件的摘要。 YAML 使用可打印的 Unicode 字符,可使用 UTF-8 或 UTF-16。 另外还有两个特殊符号在 YAML 中被保留,有可能在未来的版本被使用 --( @ )和( ` ) |
|