今天就跟大家聊聊有关在Spring Boot项目中如何实现自定义PropertySourceLoader,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。SpringBoot 的配置文件
今天就跟大家聊聊有关在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;public class JsonPropertySourceLoader implements PropertySourceLoader { public String[] getFileExtensions() { // 配置文件格式(扩展名) return new String[] { "json" }; } public PropertySource<?> 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; } 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; } 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"); } @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()); } } }}
--结束END--
本文标题: 在Spring Boot项目中如何实现自定义PropertySourceLoader
本文链接: https://www.lsjlt.com/news/226484.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-05-06
2024-05-06
2024-05-06
2024-05-06
2024-05-06
2024-05-06
2024-05-06
2024-05-06
2024-05-06
2024-05-06
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0