詳解Spring Boot 自定義PropertySourceLoader
SpringBoot 的配置文件內(nèi)置支持 properties、xml、yml、yaml 幾種格式,其中 properties和xml 對應(yīng)的Loader類為 PropertiesPropertySourceLoader ,yml和yaml 對應(yīng)的Loader類為 YamlPropertySourceLoader。
觀察這2個類可以發(fā)現(xiàn),都實(shí)現(xiàn)自接口 PropertySourceLoader 。所以我們要新增支持別的格式的配置文件,就可以通過實(shí)現(xiàn)接口 PropertySourceLoader 來實(shí)現(xiàn)了。
下面實(shí)現(xiàn)了一個 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() { // 配置文件格式(擴(kuò)展名) return new String[] { "json" }; } public PropertySource<?> load(String name, Resource resource, String profile) throws IOException { // 處理機(jī)制參考PropertiesPropertySourceLoader // 無論profile有沒有值,底層都會嘗試先執(zhí)行 load(String name, Resource resource, null),所以這個地方之間判斷等于null即可。 // 當(dāng)前版本springboot-1.5.2(后續(xù)版本未知)詳見 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文件內(nèi)容為字符串 * * @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 中創(chuàng)建 META-INF/spring.factories 文件,內(nèi)容為:
org.springframework.boot.env.PropertySourceLoader=\ com.shanhy.sboot.property.JsonPropertySourceLoader
創(chuàng)建測試的配置文件 application.json
{ "custom": { "property": { "message": "測試數(shù)據(jù)" } } }
創(chuàng)建驗(yàn)證結(jié)果的 HelloController.Java
@RestController public class HelloController { @Value("${custom.property.message:}") private String customProperty; @RequestMapping("/test") public String test() { return customProperty; } }
啟動工程服務(wù),瀏覽器訪問 http://localhost:8080/test 即可查看輸出的結(jié)果為 “測試數(shù)據(jù)”;
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot進(jìn)行Web開發(fā)的實(shí)現(xiàn)
Spring?Boot讓我們可以快速構(gòu)建項(xiàng)目并運(yùn)行web應(yīng)用,大大簡化了Spring的復(fù)雜配置,本文主要介紹了SpringBoot進(jìn)行Web開發(fā)的實(shí)現(xiàn),感興趣的可以了解一下2023-10-10SpringBoot實(shí)現(xiàn)對Http接口進(jìn)行監(jiān)控的代碼
Spring Boot Actuator是Spring Boot提供的一個模塊,用于監(jiān)控和管理Spring Boot應(yīng)用程序的運(yùn)行時(shí)信息,本文將介紹一下Spring Boot Actuator以及代碼示例,以及如何進(jìn)行接口請求監(jiān)控,需要的朋友可以參考下2024-07-07

Guava?Retryer實(shí)現(xiàn)接口重試的示例

SpringBoot實(shí)現(xiàn)接口冪等性的4種方案

Spring Boot處理全局統(tǒng)一異常的兩種方法與區(qū)別

關(guān)于Controller層和Service層的類報(bào)錯問題及解決方案