#華為云·尋找黑馬程序員#微服務-你真的懂 Yaml 嗎?

      網友投稿 729 2025-03-31

      在Java 的世界里,配置的事情都交給了 Properties,要追溯起來這個模塊還是從古老的JDK1.0 就開始了的。

      "天哪,這可是20年前的東西了,我居然還在用 Properties.."

      然而,本文的主角并不是Properties,而是Yaml。這是新時代里微服務架構上的寵兒,和 Properties 相比起來,Yaml 顯得有些弄潮兒。

      以往的大多數項目里,我們都可以發現 Properties配置文件的蹤跡,這包括用于業務屬性配置的、機機接口的、國際化的等等用途。

      而少量的一些情況下,也存在一些"混合式"的做法,比如:

      使用 Xml 來表示一些模板

      使用一個 Json 格式化的字符串

      裸奔的文本格式,應用自解析

      ...

      混雜的配置方式往往出現在一些充滿"壞味道"的項目里頭,因為代碼陳舊、斯人已矣 等原因,很難形成統一的方式。

      然而,除開 Properties 屬性文件這種簡單的配置方式之外,采用其他的方法不外乎都是為了適應配置復雜、多元化的訴求。

      那么,Yaml 就是應對這種場景而產生的,在 SpringBoot 的官方文檔中,有不少篇幅是 使用了 Yaml 語法的配置格式。

      下面介紹一下 Yaml 以及它是如何使用的。

      一、什么是 Yaml

      來自百科的定義:

      "Yaml 是一個可讀性高,易用的數據序列化格式,由 Clark Evans 在2001年首次發表。"

      可見 Yaml 并不是一個很新的東西,只是在以前接觸的人不多罷了。此外,Yaml也被各種編程語言及框架所支持, 通用性很高。

      在Java體系中,一般的微服務框架都支持甚至優先推薦使用 Yaml 作為首選的配置語言。

      而 Yaml 本身具有什么特點? 看看下面的一個實例:

      environments: ????dev: ????????url:?https://dev.example.com ??name:?Developer?Setup ????prod: ????????url:?https://another.example.com ????????name:?My?Cool?App

      這段語法等價的 Properties 為:

      environments.dev.url=https://dev.example.com environments.dev.name=Developer?Setup environments.prod.url=https://another.example.com environments.prod.name=My?Cool?App

      可見, yaml 相對來說更加的結構化,更適合用來表達一個對象。

      它在語法上有這樣的特點:

      大小寫敏感

      使用空格縮進表示層級關系,摒棄使用Tab鍵,這主要是考慮到不同平臺上文本展現時需要對齊

      縮進的空格數目不重要,只要相同層級的元素左側對齊即可

      使用 # 開頭作為注釋行

      使用 連接符(-)開頭來描述數組元素

      對比 Properties

      Properties 可以很好的實現 Key-Value 的配置,包括作為一些國際化內容的配置方式。

      但 Properties 很難表現多層級的嵌套關系,此時如果用 Yaml 可以較好的彌補該短板。

      對比 Json

      Yaml 與 Json本身沒有太多的優劣之分,兩者都是結構化的表達式語言,但是Json的設計重點在于簡單易用、方便傳輸的特性;

      而 Yaml 則側重于可讀性(更加在乎外觀),幾乎可以把 Yaml 看做是 Json 的一個"超集",即可讀性更高(更漂亮) 的結構化格式。

      此外,Json更加便于生成和解析,適合在各種跨語言、分布式的環境中傳輸和交互;與此同時, Yaml 則一般只是用作的配置較多。

      關于?Yaml 的定義可以訪問下面的地址:

      http://www.yaml.org/spec/1.2/spec.html

      二、Yaml 的語法

      Yaml 是非常簡單的, 它所定義的元素只有三個:

      對象:就是鍵值對的集合,對應于Java 中的 HashMap

      數組:指一組按序排列的值,對應于Java 中的 List

      單值:單個的、不可再分的值,比如 3,"Jackson"

      對象如何表示

      一個對象的屬性、嵌套關系通過空格縮進對齊來表示,如下:

      article: ????title:?一個人的自白書 ????author: ????????name:?陳玲 ????????gender:?female

      數組如何表示

      數組的元素通過連接符(-)來表示,如下:

      article: ????title:?一個人的自白書 ????tags: ????????-?傳記 ????????-?社會 ????????-?人物

      構成對象、數組內容的基本單元是單值,Yaml支持的單個值的類型有七種,如下:

      其中,日期、時間使用的是 ISO 8601 國際標準格式,關于它的定義可以參考:

      https://www.w3.org/TR/NOTE-datetime

      一般情況下單個值會在一行內結束。但如果遇到多行的字符串,可以使用一些特殊字符表示,

      比如:

      text:?| ??Hello ??World

      對應的結果為:

      {?text:?'Hello\nWorld\n'?}

      可以用+表示保留字符串末尾的換行,-表示刪除字符串末尾的換行:

      text1:?|+ ??Hello text2:?|- ??Hello

      對應的結果為:

      {?text1:?'Hello\n\n\n',?text2:?'Hello'?}

      除此之外,Yaml 還可以支持引用、函數、正則表達式等高級用法,但項目上一般很少用到。

      三、操作 Yaml

      目前用來操作 Yaml 的常用組件是 Snake Yaml,這個庫支持標準的?Yaml 1.1 版本。

      SpringBoot 官方文檔也介紹了整合該框架的方式,參考下面的地址:

      https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config-loading-yaml

      下面提供 將SnakeYaml 整合到項目的樣例。

      A. 引入框架

      在Maven的pom.xml文件中添加:

      ????org.yaml ????snakeyaml ????1.21

      B. 代碼片段

      實現加載配置文件

      如下面的代碼,實現了從類路徑config.yml文件中加載 yaml 配置內容:

      InputStream?inputStream?=?YamlUtil.class.getClassLoader() ????????.getResourceAsStream("config.yml"); Yaml?yaml?=?new?Yaml(); Map?objectMap?=?yaml.load(inputStream); System.out.println(objectMap.get("path"));

      實現對象轉換

      定義如下的Pojo 對象:

      public?static?class?A{ ????private?String?name?=?"hello"; ????private?List?bs?=?new?ArrayList(); ????public?String?getName()?{ ????????return?name; ????} ????public?void?setName(String?name)?{ ????????this.name?=?name; ????} ????public?List?getBs()?{ ????????return?bs; ????} ????public?void?setBs(List?bs)?{ ????????this.bs?=?bs; ????} } public?static?class?B{ ????private?String?id?=?UUID.randomUUID().toString(); ????public?String?getId()?{ ????????return?id; ????} ????public?void?setId(String?id)?{ ????????this.id?=?id; ????} }

      通過 SnakeYaml 將對象輸出為 Yaml 格式的代碼:

      A?a?=?new?A(); a.getBs().add(new?B()); a.getBs().add(new?B()); Yaml?yaml?=?new?Yaml(); String?aString?=?yaml.dumpAsMap(a); System.out.println(aString);

      輸出結果如下:

      bs: -?id:?b3688f05-ea7e-436b-bc9a-9c5df555c7fd -?id:?7906224d-8ecc-43b8-bc3b-07985bc18ebd name:?hello

      此時如果希望將Yaml 文本反過來轉換為 A 對象,可以執行下面的代碼:

      A?a1?=?new?Yaml().parseToObject(aString,?A.class); ...

      C. 完整案例

      最終,我們可以將 Yaml 文檔的操作封裝為一個工具類,方便在業務代碼中集成。

      YamlUtil.java

      public?class?YamlUtil?{ ????/** ?????*?從資源文件加載內容,并解析為Map對象 ?????* ?????*?@param?path ?????*?@return ?????*/ ????public?static?Map?loadToMap(String?path)?{ ????????if?(StringUtils.isEmpty(path))?{ ????????????return?Collections.emptyMap(); ????????} ????????InputStream?inputStream?=?YamlUtil.class.getClassLoader() ????????????????.getResourceAsStream(path); ????????Yaml?yaml?=?new?Yaml(); ????????Map?objectMap?=?yaml.load(inputStream); ????????return?objectMap; ????} ????/** ?????*?將字符串解析為Map對象 ?????* ?????*?@param?content ?????*?@return ?????*/ ????public?static?Map?parseToMap(String?content)?{ ????????if?(StringUtils.isEmpty(content))?{ ????????????return?Collections.emptyMap(); ????????} ????????Yaml?yaml?=?new?Yaml(); ????????Map?objectMap?=?yaml.load(content); ????????return?objectMap; ????} ????/** ?????*?將字符串解析為類對象 ?????* ?????*?@param?content ?????*?@param?clazz ?????*?@param? ?????*?@return ?????*/ ????public?static??T?parseToObject(String?content,?Class?clazz)?{ ????????if?(StringUtils.isEmpty(content)?||?clazz?==?null)?{ ????????????return?null; ????????} ????????Yaml?yaml?=?new?Yaml(new?Constructor(clazz)); ????????T?object?=?yaml.load(content); ????????return?object; ????} ????/** ?????*?格式化對象 ?????* ?????*?@param?object ?????*?@return ?????*/ ????public?static?String?format(Object?object)?{ ????????Yaml?yaml?=?new?Yaml(); ????????return?yaml.dumpAsMap(object); ????} }

      至此,我們已經完成了 Yaml 的讀寫。當然,除了上述的Snake Yaml 之外,還可以使用 流行的 Jackson 組件了進行解析,這里不再過多贅述,有興趣的朋友可以自行嘗試。

      參考文檔

      阮一峰-YAML語言教程:

      http://www.ruanyifeng.com/blog/2016/07/yaml.html

      SnakeYaml 官方文檔:

      https://bitbucket.org/asomov/snakeyaml/wiki/Documentation

      #華為云·尋找黑馬程序員#微服務-你真的懂 Yaml 嗎?

      Yaml 1.2 規范:

      http://www.yaml.org/spec/1.2/spec.html

      SpringBoot-LoadingYaml

      https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config-loading-yaml

      云計算

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:如何把excel多個單元格內容融合到一起(excel把多個單元格內容合并到一起)
      下一篇:表格中的段落如何設置行間距(表格中如何修改段落行間距)
      相關文章
      偷自拍亚洲视频在线观看99| 亚洲国产精品张柏芝在线观看| 亚洲国产视频久久| 少妇中文字幕乱码亚洲影视| 国产V亚洲V天堂无码久久久| 亚洲一区二区三区在线观看精品中文| 亚洲欧洲日产国码高潮αv| 国产精品亚洲专区一区| 亚洲av日韩精品久久久久久a| 亚洲依依成人亚洲社区| 456亚洲人成影院在线观| 亚洲第一成人在线| 国产人成亚洲第一网站在线播放| 亚洲人成综合网站7777香蕉| 中文字幕亚洲综合小综合在线| 国产精品久久亚洲不卡动漫| 久久精品国产99国产精品亚洲| 亚洲av日韩av综合| 中文字幕乱码亚洲无线三区| 99热亚洲色精品国产88| 亚洲色无码专区一区| 亚洲中文字幕无码中文字| 中文字幕亚洲男人的天堂网络| 91在线亚洲综合在线| 亚洲国产成人久久综合| 亚洲另类自拍丝袜第五页| 亚洲爆乳无码专区www| 亚洲a∨国产av综合av下载| 狠狠入ady亚洲精品| 亚洲男人第一无码aⅴ网站| 亚洲中文字幕无码专区| 国产亚洲成AV人片在线观黄桃| 久久精品国产亚洲AV麻豆~| 久久亚洲中文字幕精品有坂深雪| 亚洲视频在线观看免费视频| 亚洲制服丝袜在线播放| 亚洲色成人WWW永久在线观看| 亚洲.国产.欧美一区二区三区| 亚洲av无码成人精品区在线播放| 国产成人精品久久亚洲高清不卡 | 77777亚洲午夜久久多人|