zookeeper python接口实例详解
407
2023-05-18
详解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> 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 return new MapPropertySource(name, result); } return null; } /** * 解析Resource为Map * * @param resource * @return * @throws IOException * * @author 单红宇(CSDN CATOOP) * @create 2017年4月20日 */ private Map if (resource == null) { return null; } Map JsonParser parser = JsonParserFactory.getJsonParser(); Map 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[] 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 if (prefix.length() > 0) { prefix += "."; } for (Map.Entry if (entrySet.getValue() instanceof Map) { nestMap(prefix + entrySet.getKey(), result, (Map } 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 即可查看输出的结果为 “测试数据”;
return new MapPropertySource(name, result);
}
return null;
}
/**
* 解析Resource为Map
*
* @param resource
* @return
* @throws IOException
*
* @author 单红宇(CSDN CATOOP)
* @create 2017年4月20日
*/
private Map
if (resource == null) {
return null;
}
Map
JsonParser parser = JsonParserFactory.getJsonParser();
Map
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[] 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
if (prefix.length() > 0) {
prefix += ".";
}
for (Map.Entry
if (entrySet.getValue() instanceof Map) {
nestMap(prefix + entrySet.getKey(), result, (Map
} 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 即可查看输出的结果为 “测试数据”;
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~