十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
今天就跟大家聊聊有关在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) { Mapresult = 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 mapPropertySource(Resource resource) throws IOException { if (resource == null) { return null; } Map result = new HashMap (); JsonParser parser = JsonParserFactory.getJsonParser(); Map 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 byteList = new LinkedList (); 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 result, Map map) { if (prefix.length() > 0) { prefix += "."; } for (Map.Entry entrySet : map.entrySet()) { if (entrySet.getValue() instanceof Map) { nestMap(prefix + entrySet.getKey(), result, (Map ) 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有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注创新互联行业资讯频道,感谢大家的支持。