首页 > 其他分享 >springboot扩展配置文件自动加载

springboot扩展配置文件自动加载

时间:2024-11-18 19:09:15浏览次数:1  
标签:core String 配置文件 springframework org import 加载 properties springboot

import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.setting.yaml.YamlUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.env.EnvironmentPostProcessor;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.MutablePropertySources;
import org.springframework.core.env.PropertiesPropertySource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

import java.io.InputStream;
import java.util.*;

@Slf4j
public class ExpandEnvironmentPostProcessor implements EnvironmentPostProcessor {
    private static final List<String> FILE_TYPE = ListUtil.of("yml", "yaml", "properties");
    @Override
    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
        ClassLoader classLoader = ConfigurableEnvironment.class.getClassLoader();
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(classLoader);
        try {
            List<Resource> resourceList = new ArrayList<>();
            for (String fileType : FILE_TYPE) {
                Resource[] resources = resolver.getResources("classpath*:*." + fileType);
                for (Resource resource : resources) {
                    String fileName = resource.getFilename();
                    String prefix = FileUtil.getPrefix(fileName);
                    if (!CharSequenceUtil.startWith(prefix, "application") && !CharSequenceUtil.startWith(prefix, "bootstrap")) {
                        resourceList.add(resource);
                    }
                }
            }
            for (Resource resource : resourceList) {
                String fileName = Optional.ofNullable(resource.getFilename()).orElse("unknown");
                String fileType = FileUtil.extName(fileName);
                InputStream inputStream = resource.getInputStream();
                Properties properties = new Properties();
                if ("properties".equalsIgnoreCase(fileType)) {
                    properties.load(inputStream);
                } else {
                    Map<?, ?> yamlMap = YamlUtil.load(inputStream, Map.class);
                    convertToProperties(Convert.toMap(String.class, Object.class, yamlMap), "", properties);
                }
                MutablePropertySources propertySources = environment.getPropertySources();
                propertySources.addFirst(new PropertiesPropertySource(fileName, properties));
            }
        } catch (Exception e) {
            log.error("ExpandEnvironmentPostProcessor error", e);
        }
    }

    private void convertToProperties(Map<String, Object> dict, String parentKey, Properties properties) {
        for (Map.Entry<String, Object> dictEntry : dict.entrySet()) {
            String key = CharSequenceUtil.isNotBlank(parentKey) ? parentKey + "." + dictEntry.getKey() : dictEntry.getKey();
            Object object = dictEntry.getValue();
            if (object instanceof Map) {
                convertToProperties(Convert.toMap(String.class, Object.class, object), key, properties);
            } else if (Objects.nonNull(object)) {
                properties.put(key, object);
            }
        }
    }
}

  

标签:core,String,配置文件,springframework,org,import,加载,properties,springboot
From: https://www.cnblogs.com/langty/p/18553433

相关文章

  • springboot毕设个人博客网站程序+论文
    系统程序文件列表开题报告内容研究背景随着互联网的快速发展,个人博客作为一种表达自我、分享知识与见解的重要平台,受到了越来越多人的青睐。从早期的博客园、CSDN博客,到如今的各类自媒体平台,博客形式灵活多样,内容丰富多彩,成为连接作者与读者之间的桥梁。然而,市面上的博客平......
  • springboot毕设个人博客的设计与实现程序+论文
    系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展和普及,个人博客作为一种表达自我、分享知识和交流思想的平台,逐渐成为了现代人日常生活中不可或缺的一部分。特别是在当前信息爆炸的时代,人们渴望有一个属于自己的空间,用以记录生活点滴、展示专业技能、分享心......
  • springboot毕设个人博客程序+论文
    系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展和普及,个人博客作为一种重要的网络应用形式,逐渐成为了人们分享知识、表达观点、记录生活的重要平台。特别是在信息爆炸的今天,个人博客不仅能够为用户提供个性化的内容展示空间,还能够通过互动交流,增强用户之间......
  • SPRINGBOOT上传文件夹的三种解决方案
    前端:vue2,vue3,vue-cli,webuploader,html5后端:SpringBoot数据库:MySQL,Oracle,SQLServer,达梦,人大金仓,国产化数据库协议:HTTPWebServer:Tomcat,Resin服务器:Linux,国产化系统功能:大文件上传,断点续传,秒传,加密传输,加密存储,文件夹上传,文件夹层级结构技术:支持第三方软件集......
  • SpringBoot在线音乐系统的设计与实现8355m程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、项目背景与意义随着数字化技术的快速发展,音乐产业正在经历深刻的变革。在线音乐系统以其便捷性、即时性和丰富性,成为音乐爱好者的首选。本项目......
  • SpringBoot招聘就业管理531ii--(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、课题名称招聘就业管理系统设计与实现二、研究背景与意义随着就业市场的日益扩大和竞争的加剧,招聘就业管理成为企业和求职者共同关注的焦点。......
  • SpringBoot证券交易系统rx5y4--程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、项目背景随着金融市场的快速发展,证券交易在经济活动中扮演着越来越重要的角色。传统的证券交易方式存在信息处理不及时、交易效率低下等问题,无......
  • 网页中加载 SVG 的七大方式
    一、直接使用<img>标签加载外部SVG文件<imgsrc="path/to/image.svg"alt="描述文字"><!--若多个svg格式的img的宽高设定为百分百高度,容易会造成首屏加载svg的高度为0-->优点:简单易用:与加载其他图片格式(如PNG、JPEG)相同。浏览器支持良好:现代浏览器普遍支持。可缓存:SVG......
  • H.265流媒体播放器EasyPlayer.js无插件H5播放器关于页面首次加载超时检测
    EasyPlayer.js网页直播/点播播放器是TSINGSEE青犀流媒体组件系列中关注度较高的产品,经过多年的发展和迭代,目前已经有多个应用版本,包括RTSP版、RTMP版、Pro版以及js版,其中js版本作为网页播放器,受到了用户的广泛使用。在功能上,EasyPlayer.js播放器支持直播、点播、录像、快照截图......
  • springboot开放实验预约系统-计算机毕业设计源码57790
    目 录1绪论1.1研究背景与意义1.2国内外研究现状1.3论文结构与章节安排2 系统分析2.1可行性分析2.1.1技术可行性分析2.1.2 经济可行性分析2.1.3法律可行性分析2.2系统功能分析2.2.1功能性分析2.2.2非功能性分析2.3 系统用例分析2.4 ......