1. 程式人生 > >springboot中對yaml檔案的解析

springboot中對yaml檔案的解析

  一、YAML是“YAML不是一種標記語言”的外語縮寫 (見前方參考資料原文內容);但為了強調這種語言以資料做為中心,而不是以置標語言為重點,而用返璞詞重新命名。它是一種直觀的能夠被電腦識別的資料序列化格式,是一個可讀性高並且容易被人類閱讀,容易和指令碼語言互動,用來表達資料序列的程式語言。

  二、在springboot中的基礎配置是通過yaml的方式來解析實現,當然也支援xml的檔案解析。這裡主要是學習原始碼中瞭解到yaml的解析過程。幫助自己在學習原始碼的時候,判定spring做了哪些操作。

  三、yaml的配置檔案

server:
  port: 8080
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/model?useUnicode=true
&characterEncoding=utf-8 username: root password: root jpa: show-sql: true hibernate: ddl-auto: update

  四、yaml的解析過程

import org.springframework.core.io.Resource;
import org.springframework.lang.NonNull;
import org.springframework.lang.Nullable;
import org.springframework.util.StringUtils;
import org.yaml.snakeyaml.Yaml; import org.yaml.snakeyaml.reader.UnicodeReader; import java.io.IOException; import java.util.*; public class YamlUtils { /** * 單個yaml檔案處理 * @param resource * @return * @throws IOException */ public static Map<String, Object> yamlHandler(@NonNull Resource resource) throws
IOException { //返回的結果 Map<String, Object> result = new LinkedHashMap<>(); //讀取方式 UnicodeReader reader = new UnicodeReader(resource.getInputStream()); //單檔案處理 Yaml yaml = new Yaml(); Object object = yaml.load(reader); //這裡只是簡單處理,需要多個方式可以自己新增 if (object instanceof Map) { Map map = (Map) object; buildFlattenedMap(result, map, null); } reader.close(); return result; } /** * 單個yaml檔案處理 * @param resources * @return * @throws IOException */ public static Map<String, Object> yamlHandler(@NonNull Resource[] resources) throws IOException { //返回的結果 Map<String, Object> result = new LinkedHashMap<>(); Yaml yaml = new Yaml(); //多個檔案處理 Iterator<Resource> iterator = Arrays.stream(resources).iterator(); while (iterator.hasNext()) { Resource resource = iterator.next(); UnicodeReader reader = new UnicodeReader(resource.getInputStream()); Object object = yaml.load(reader); //這裡只是簡單處理,需要多個方式可以自己新增 if (object instanceof Map) { Map map = (Map) object; buildFlattenedMap(result, map, null); } reader.close(); } return result; } /** * 這部分程式碼來至springboot原始碼部分對yaml的解析 * YamlProcessor.java buildFlattenedMap方法 * @param result * @param source * @param path */ private static void buildFlattenedMap(Map<String, Object> result, Map<String, Object> source, @Nullable String path) { //迴圈讀取原資料 source.forEach((key, value) -> { //如果存在路徑進行拼接 if (StringUtils.hasText(path)) { if (key.startsWith("[")) { key = path + key; } else { key = path + '.' + key; } } //資料型別匹配 if (value instanceof String) { result.put(key, value); } else if (value instanceof Map) { //如果是map,就繼續讀取 Map<String, Object> map = (Map)value; buildFlattenedMap(result, map, key); } else if (value instanceof Collection) { Collection<Object> collection = (Collection)value; if (collection.isEmpty()) { result.put(key, ""); } else { int count = 0; Iterator var7 = collection.iterator(); while(var7.hasNext()) { Object object = var7.next(); buildFlattenedMap(result, Collections.singletonMap("[" + count++ + "]", object), key); } } } else { result.put(key, value != null ? value : ""); } }); } }

   五、測試

   public static void main(String[] args) throws IOException {
        Map<String, Object> map = YamlUtils.yamlHandler(new ClassPathResource("config/application.yaml"));
        System.out.println(map);
    }