Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >springboot 自定义配置解析器

springboot 自定义配置解析器

作者头像
分享干货的你
发布于 2021-04-06 08:18:50
发布于 2021-04-06 08:18:50
1.3K00
代码可运行
举报
文章被收录于专栏:分享干货的你分享干货的你
运行总次数:0
代码可运行

假如有一个需求: 初始化要加载很多的JSON 格式的文件, 到Spring容器中,spring 上下文。 直接使用@value 注解获取一些属性值。 这种就需要自己来自定义解析器, springboot 默认支持application.properties 和 application.yml ,这里我们要自定义application.json , 解析json 文件, 变成kv的map 形式。 再用@value 注解获取。

我们看一下propertySourceLoad 的源码

第一个方法返回的是后缀是什么格式的。

第二个是加载文件变成 PropertySource 。

第三个是要返回MapPropertySource 变成k,v 形式 才能被 @Value 识别。

第四最后在加入META-INF/spring.factories里面,

org.springframework.boot.env.PropertySourceLoader =xxxx

指定自定义的ProPertySourceLoader

代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 *  自定义json 配置文件解析器 ,可以使用@Value 的注解
 */
public class JsonPropertySourceLoader implements PropertySourceLoader {

    /**
     *  返回支持的文件扩展名, 目前只支持json
     * @return
     */
    @Override
    public String[] getFileExtensions() {
        return new String[]{"json"};
    }

    /**
     *  把json 转成key value 形式
     * @param name
     * @param resource
     * @return
     * @throws IOException
     */
    @Override
    public List<PropertySource<?>> load(String name, Resource resource) throws IOException {
        return Collections.singletonList(new MapPropertySource(name, mapPropertySource(resource)));
    }

    /**
     * Resource转Map
     *
     * @param resource
     * @return
     */
    private Map<String, Object> mapPropertySource(Resource resource) {

        Map<String, Object> result = new HashMap<>();
        // 获取json格式的Map
        Map<String, Object> fileMap = JSONObject.parseObject(readFile(resource),Map.class);
        // 组装嵌套json
        processorMap("", result, fileMap);
        return result;
    }

    private void processorMap(String prefix, Map<String, Object> result, Map<String, Object> fileMap) {
        if (prefix.length() > 0) {
            prefix += ".";
        }
        for (Map.Entry<String, Object> entrySet : fileMap.entrySet()) {
            if (entrySet.getValue() instanceof Map) {
                processorMap(prefix + entrySet.getKey(), result, (Map<String, Object>) entrySet.getValue());
            } else {
                result.put(prefix + entrySet.getKey(), entrySet.getValue());
            }
        }
    }

    /**
     * JSON格式
     *
     * @param resource
     * @return
     */
    private String readFile(Resource resource) {
        FileInputStream fileInputStream = null;
        try {
            fileInputStream = new FileInputStream(resource.getFile());
            String str = "";
            byte[] readByte = new byte[1024];
            int length;
            while ((length = fileInputStream.read(readByte)) > 0) {
                str += new String(readByte, 0, length, "UTF-8");
            }

            return str;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (fileInputStream != null) {
                try {
                    fileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 分享干货的你 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
springboot 自定义加载配置文件2
在上一篇文章, 我们使用了propertiesSourceLoad 实现了,加载JSON 文件 , 在使用@value 注解获取json 格式配置文件的值。 但是存在两个问题,json 的名字不能自己定义,只能叫application.json . 并且好像打成jar包的时候,classPathResource 好像获取不到这个json 文件。
分享干货的你
2021/04/06
7440
基于SpringBoot的Environment源码理解实现分散配置
org.springframework.core.env.Environment是当前应用运行环境的公开接口,主要包括应用程序运行环境的两个关键方面:配置文件(profiles)和属性。Environment继承自接口PropertyResolver,而PropertyResolver提供了属性访问的相关方法。这篇文章从源码的角度分析Environment的存储容器和加载流程,然后基于源码的理解给出一个生产级别的扩展。
Throwable
2020/06/23
2K0
京东技术解密之配置中心DUCC
支持多环境(或称分组),分组可以合并 内置强大的基于插件的数据绑定框架,支持多种类型转换; 支持Log4j、Log4j2、Logback的动态修改日记级别功能。 支持Spring原生注解、支持自定义注解,客户端代码入侵性低 支持客户端多配置源,支持自定义配置,如ZK、Consol扩展 支持配置预案切换
公众号_松华说
2019/07/16
10.8K1
京东技术解密之配置中心DUCC
Springboot之ConfigFileApplicationListener
                                                                                     图1
克虏伯
2019/08/06
9840
Springboot之ConfigFileApplicationListener
SpringMVC实现原理
今天我们来实现一个简单的springMVC框架,可以理解为 springMVC1.0这个版本,只是功能比较简单而已;
用户2141593
2019/02/20
4820
SpringBoot Profile使用详解及配置源码解析
Profile对应中文并没有合适的翻译,它的主要作用就是让Spring Boot可以根据不同环境提供不同的配置功能支持。
程序新视界
2019/12/26
1.5K0
springboot aop 自定义注解方式实现完善日志记录(完整源码)
主要记录的信息有: 操作人,方法名,参数,运行时间,操作类型(增删改查),详细描述,返回值。
用户1518699
2019/11/29
3.5K0
SpringBoot基础系列之自定义配置源使用姿势实例演示
前面一篇博文介绍了一个@Value的一些知识点,其中提了一个点,@Value对应的配置,除了是配置文件中之外,可以从其他的数据源中获取么,如从 redis,db,http 中获取配置?
一灰灰blog
2021/06/12
4270
SpringBoot基础系列之自定义配置源使用姿势实例演示
写一个自己的springMVC
今天我们来实现一个简单的springMVC框架,可以理解为 springMVC1.0这个版本,只是功能比较简单而已;
矿泉水
2018/05/11
1.2K1
写一个自己的springMVC
Apollo与SpringBoot整合原理深度剖析
AbstractBeanFactory的embeddedValueResolvers集合中StringValueResolver 的注册时机是什么呢?
大忽悠爱学习
2023/05/23
1.1K0
Apollo与SpringBoot整合原理深度剖析
写一个自己的springMVC?
今天我们来实现一个简单的springMVC框架,可以理解为 springMVC1.0这个版本,只是功能比较简单而已;
用户2141593
2019/02/20
4900
spring-boot-route(二):读取配置文件的几种方式
Spring Boot提供了两种格式的配置文件,分别是properties 和 yml。Spring Boot最大的特点就是自动化配置,如果我们想修改自动化配置的默认值,就可以通过配置文件来指定自己服务器相关的参数。
Java旅途
2020/10/21
1K0
万字讲解SpringBoot自定义Starter
在使用SpringBoot进行开发的时候,我们发现使用很多技术都是直接导入对应的starter,然后就实现了springboot整合对应技术,再加上一些简单的配置,就可以直接使用了。那什么是Starter呢?使用Starter对我们开发有什么好处?自定义Starter能对我们有什么帮助呢?
观止study
2024/02/08
7700
SpringBoot系列-配置解析
在日常的开发和运维过程中,可以说配置都是及其重要的,因为它可能影响到应用的正常启动或者正常运行。相信在之前 Spring xml 时代,很多人都会被一堆 xml 配置折腾的够呛,除此之外,还有像数据库连接配置、缓存配置、注册中心配置、消息配置等等,这些相信大家都不会陌生。
安徽开发者圈
2020/03/02
1.3K0
Java模拟表单post提交,可支持图片上传
/** * 模拟表单post * * @param textMap 文本域 * @param fileMap 文件 * */ public static String postForm(String urlStr, Map<String, String> textMap, Map<String, String> fileMap) throws IOException { String res = ""; HttpURLConnection conn = null; In
用户1503405
2021/09/23
1.4K0
spring cloud 自定义配置源及配置刷新
通过自定义配置源可以接入自己的配置服务,配合ContextRefresher可以让应用运行中自动更新配置。
acupt
2019/08/26
7410
springboot实战之读取自定义配置文件
我们在开发springboot的项目过程中,为了不把所有的配置信息全都写在application.(yml/properties)中,我们需要自定义配置文件比如common.properties,那么问题来了,我们要如何读取common.properties里面的内容。
lyb-geek
2019/08/06
8.7K0
Apollo 源码解析 —— 服务自身配置 ServerConfig
摘要: 原创出处 http://www.iocoder.cn/Apollo/server-config/ 「芋道源码」欢迎转载,保留摘要,谢谢!
芋道源码
2020/06/01
1.2K0
SpringBoot读取配置文件源码探究
继续,重点是invokeListener方法,去调用监听器事件,可以想象对配置文件来讲,这就是读取配置事件了。同时监听器有很多,读取配置文件的监听器是ConfigFileAplicationListener,看名字还是蛮明显的吧
老梁
2019/08/29
3.1K0
Spring中PropertySource属性源配置文件的优先级、顺序问题大解析(加载流程)【享学Spring】
关于Spring的配置文件的优先级、加载顺序一直是个老生常谈的问题。但即使经常被提起,却还是经常被忘记或者弄混。有一种听了很多道理但仍过不好这一生的赶脚有木有。
YourBatman
2019/09/03
7.6K0
Spring中PropertySource属性源配置文件的优先级、顺序问题大解析(加载流程)【享学Spring】
相关推荐
springboot 自定义加载配置文件2
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验