中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

在Spring Boot項目中如何實現自定義PropertySourceLoader

發布時間:2020-11-18 16:24:44 來源:億速云 閱讀:257 作者:Leah 欄目:編程語言

今天就跟大家聊聊有關在Spring Boot項目中如何實現自定義PropertySourceLoader,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

SpringBoot 的配置文件內置支持 properties、xml、yml、yaml 幾種格式,其中 properties和xml 對應的Loader類為 PropertiesPropertySourceLoader ,yml和yaml 對應的Loader類為 YamlPropertySourceLoader。

觀察這2個類可以發現,都實現自接口 PropertySourceLoader 。所以我們要新增支持別的格式的配置文件,就可以通過實現接口 PropertySourceLoader 來實現了。

下面實現了一個 json 格式的配置文件 Loader類:

package com.shanhy.sboot.property;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import org.springframework.boot.env.PropertySourceLoader;
import org.springframework.boot.json.JsonParser;
import org.springframework.boot.json.JsonParserFactory;
import org.springframework.core.env.MapPropertySource;
import org.springframework.core.env.PropertySource;
import org.springframework.core.io.Resource;

/**
 * JSON格式配置文件加載器
 * 
 * @author 單紅宇(CSDN CATOOP)
 * @create 2017年4月20日
 */
public class JsonPropertySourceLoader implements PropertySourceLoader {

  public String[] getFileExtensions() {
    // 配置文件格式(擴展名)
    return new String[] { "json" };
  }

  public PropertySource<&#63;> load(String name, Resource resource, String profile) throws IOException {
    // 處理機制參考PropertiesPropertySourceLoader
    // 無論profile有沒有值,底層都會嘗試先執行 load(String name, Resource resource, null),所以這個地方之間判斷等于null即可。
    // 當前版本springboot-1.5.2(后續版本未知)詳見 ConfigFileApplicationListener 的 445 行
    if (profile == null) {
      Map<String, Object> result = mapPropertySource(resource);
      return new MapPropertySource(name, result);
    }
    return null;
  }

  /**
   * 解析Resource為Map
   *
   * @param resource
   * @return
   * @throws IOException
   * 
   * @author 單紅宇(CSDN CATOOP)
   * @create 2017年4月20日
   */
  private Map<String, Object> mapPropertySource(Resource resource) throws IOException {
    if (resource == null) {
      return null;
    }
    Map<String, Object> result = new HashMap<String, Object>();
    JsonParser parser = JsonParserFactory.getJsonParser();
    Map<String, Object> map = parser.parseMap(readFile(resource));
    nestMap("", result, map);
    return result;
  }

  /**
   * 讀取Resource文件內容為字符串
   *
   * @param resource
   * @return
   * @throws IOException
   * 
   * @author 單紅宇(CSDN CATOOP)
   * @create 2017年4月20日
   */
  private String readFile(Resource resource) throws IOException {
    InputStream inputStream = resource.getInputStream();
    List<Byte> byteList = new LinkedList<Byte>();
    byte[] readByte = new byte[1024];
    int length;
    while ((length = inputStream.read(readByte)) > 0) {
      for (int i = 0; i < length; i++) {
        byteList.add(readByte[i]);
      }
    }
    byte[] allBytes = new byte[byteList.size()];
    int index = 0;
    for (Byte soloByte : byteList) {
      allBytes[index] = soloByte;
      index += 1;
    }
    return new String(allBytes, "UTF-8");
  }

  /**
   * 處理map(map中可能還嵌套map,遞歸處理),最終輸出一個非嵌套的map
   *
   * @param prefix
   *      前綴
   * @param result
   *      處理后的map
   * @param map
   *      處理前的map
   * 
   * @author 單紅宇(CSDN CATOOP)
   * @create 2017年4月20日
   */
  @SuppressWarnings("unchecked")
  private void nestMap(String prefix, Map<String, Object> result, Map<String, Object> map) {
    if (prefix.length() > 0) {
      prefix += ".";
    }
    for (Map.Entry<String, Object> entrySet : map.entrySet()) {
      if (entrySet.getValue() instanceof Map) {
        nestMap(prefix + entrySet.getKey(), result, (Map<String, Object>) entrySet.getValue());
      } else {
        result.put(prefix + entrySet.getKey().toString(), entrySet.getValue());
      }
    }
  }
}

然后在 src/main/resources 中創建 META-INF/spring.factories 文件,內容為:

org.springframework.boot.env.PropertySourceLoader=\
com.shanhy.sboot.property.JsonPropertySourceLoader

創建測試的配置文件 application.json

{
  "custom": {
    "property": {
      "message": "測試數據"
    }
  }
}

創建驗證結果的 HelloController.Java

@RestController
public class HelloController {

  @Value("${custom.property.message:}")
  private String customProperty;

  @RequestMapping("/test")
  public String test() {
    return customProperty;
  }
}

啟動工程服務,瀏覽器訪問 http://localhost:8080/test 即可查看輸出的結果為 “測試數據”;

看完上述內容,你們對在Spring Boot項目中如何實現自定義PropertySourceLoader有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

沾化县| 清镇市| 石嘴山市| 安丘市| 改则县| 乌兰察布市| 甘肃省| 高碑店市| 浙江省| 常宁市| 青州市| 土默特右旗| 永清县| 甘孜县| 和龙市| 白河县| 怀远县| 蒲城县| 连山| 藁城市| 浮梁县| 濉溪县| 封丘县| 郧西县| 丰顺县| 远安县| 华宁县| 布拖县| 广宁县| 金寨县| 平陆县| 扎囊县| 赫章县| 新巴尔虎右旗| 遂平县| 龙川县| 北安市| 道真| 佛冈县| 凌源市| 威远县|