详解Spring Boot 自定义PropertySourceLoader
发布时间 - 2026-01-11 00:59:56 点击率:次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<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 即可查看输出的结果为 “测试数据”;
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# propertysourceloader
# Spring
# Boot
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
中山网站推广排名,中山信息港登录入口?
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
焦点电影公司作品,电影焦点结局是什么?
再谈Python中的字符串与字符编码(推荐)
在线制作视频网站免费,都有哪些好的动漫网站?
Java垃圾回收器的方法和原理总结
Laravel如何使用Passport实现OAuth2?(完整配置步骤)
Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】
如何快速生成可下载的建站源码工具?
如何在不使用负向后查找的情况下匹配特定条件前的换行符
如何基于云服务器快速搭建个人网站?
ChatGPT 4.0官网入口地址 ChatGPT在线体验官网
如何在万网主机上快速搭建网站?
Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤
Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】
微信小程序 五星评分(包括半颗星评分)实例代码
Laravel怎么实现验证码(Captcha)功能
Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】
googleplay官方入口在哪里_Google Play官方商店快速入口指南
laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法
jquery插件bootstrapValidator表单验证详解
Laravel怎么自定义错误页面_Laravel修改404和500页面模板
百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭
如何自定义建站之星网站的导航菜单样式?
Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】
黑客如何利用漏洞与弱口令入侵网站服务器?
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
如何在阿里云购买域名并搭建网站?
如何在IIS中新建站点并配置端口与IP地址?
创业网站制作流程,创业网站可靠吗?
如何确保西部建站助手FTP传输的安全性?
java中使用zxing批量生成二维码立牌
Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?
利用JavaScript实现拖拽改变元素大小
Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】
Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
网站制作软件免费下载安装,有哪些免费下载的软件网站?
敲碗10年!Mac系列传将迎来「触控与联网」双革新
香港服务器WordPress建站指南:SEO优化与高效部署策略
php在windows下怎么调试_phpwindows环境调试操作说明【操作】
移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?
如何用PHP快速搭建高效网站?分步指南
Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives
装修招标网站设计制作流程,装修招标流程?
如何在服务器上三步完成建站并提升流量?
Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
Android滚轮选择时间控件使用详解
Python文件异常处理策略_健壮性说明【指导】

