SpringBoot使用spring.factories加载默认配置的实现代码

 更新时间:2024年06月24日 09:43:07   作者:code2roc  
在日常开发过程中,发布一些产品或者框架时,会遇到某些功能需要一些配置才能正常运行,这时我们需要的提供默认配置项,同时用户也能覆盖进行个性化

在日常开发过程中,发布一些产品或者框架时,会遇到某些功能需要一些配置才能正常运行,这时我们需要的提供默认配置项,同时用户也能覆盖进行个性化

创建Initializer

public class FrameContextInitializer implements ApplicationContextInitializer  {

    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {
        System.out.println("FrameContextInitializer--Start");
        System.out.println("FrameContextInitializer--End");
    }
}

配置Initializer

resources/META-INF文件夹下创建spring.factories文件,指定实现类

org.springframework.context.ApplicationContextInitializer=com.haopan.frame.common.initializer.FrameContextInitializer

实现Initializer

读取默认yml文件

 String frameYAMLFilePath = ClassPathFileUtil.getFilePathActual("systemfile/config/frame.yml");
 
 public static String getFilePathActual(String classFilePath) {
        String filePath = "";
        try {
            String templateFilePath = "tempfiles/classpathfile/";
            File tempDir = new File(templateFilePath);
            if (!tempDir.exists()) {
                tempDir.mkdirs();
            }
            String[] filePathList = classFilePath.split("/");
            String checkFilePath = "tempfiles/classpathfile";
            for (String item : filePathList) {
                checkFilePath += "/" + item;
            }
            File tempFile = new File(checkFilePath);
            if (tempFile.exists()) {
               tempFile.delete();
            }
            //解析
            ClassPathResource classPathResource = new ClassPathResource(classFilePath);
            InputStream inputStream = classPathResource.getInputStream();
            checkFilePath = "tempfiles/classpathfile";
            for (int i = 0; i < filePathList.length; i++) {
                checkFilePath += "/" + filePathList[i];
                if (i == filePathList.length - 1) {
                    //文件
                    File file = new File(checkFilePath);
                    if(!file.exists()){
                        FileUtils.copyInputStreamToFile(inputStream, file);
                    }
                } else {
                    //目录
                    tempDir = new File(checkFilePath);
                    if (!tempDir.exists()) {
                        tempDir.mkdirs();
                    }
                }
            }
            inputStream.close();
            filePath = checkFilePath;

        } catch (Exception e) {
            e.printStackTrace();
        }
        return filePath;
    }

将yml内容加到环境上下文

这边的addLast是执行顺序为最后读取,如果项目的yml文件没有读取到,则默认配置是一个保底

System.out.println("FrameContextInitializer--Start");    

PropertySource<?> propertySource = loader.load("frameConfiguration", new InputStreamResource(new FileInputStream(frameYAMLFilePath))).get(0);
applicationContext.getEnvironment().getPropertySources().addLast(propertySource);

System.out.println("FrameContextInitializer--End");

到此这篇关于SpringBoot使用spring.factories加载默认配置的实现代码的文章就介绍到这了,更多相关SpringBoot spring.factories加载配置内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MyBatis resultMap id标签的错误使用方式

    MyBatis resultMap id标签的错误使用方式

    这篇文章主要介绍了MyBatis resultMap id标签的错误使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • java web FTPClient实现上传文件到指定服务器

    java web FTPClient实现上传文件到指定服务器

    这篇文章主要为大家详细介绍了java web FTPClient实现上传文件到指定服务器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • Spring Boot集成ShedLock分布式定时任务的实现示例

    Spring Boot集成ShedLock分布式定时任务的实现示例

    ShedLock确保您计划的任务最多同时执行一次。如果一个任务正在一个节点上执行,则它会获得一个锁,该锁将阻止从另一个节点(或线程)执行同一任务。
    2021-05-05
  • Java Mybatis框架由浅入深全解析上篇

    Java Mybatis框架由浅入深全解析上篇

    MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注SQL本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码本文将为大家初步的介绍一下MyBatis的使用
    2022-07-07
  • Java中异或的深入讲解

    Java中异或的深入讲解

    这篇文章主要给大家介绍了关于Java中异或的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • Hibernate核心类和接口的详细介绍

    Hibernate核心类和接口的详细介绍

    今天小编就为大家分享一篇关于Hibernate核心类和接口的详细介绍,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • Java反射的两种使用方法(推荐)

    Java反射的两种使用方法(推荐)

    这篇文章主要介绍了Java反射的两种使用方法,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧
    2018-05-05
  • 详解JDBC使用

    详解JDBC使用

    JDBC(Java Database Connectivity),即Java数据库连接,是一种用于执行SQL语句的Java API,可以为多种关系数据库提供同一访问,它由一组用Java语言编写的类和接口组成。
    2017-05-05
  • Spring Cloud Feign原理详解

    Spring Cloud Feign原理详解

    Feign 主要是帮助我们方便进行rest api服务间的调用,本文从Spring Cloud对feign封装的源码中去了解其主要实现机制
    2021-06-06
  • SpringBoot配置HTTPS及开发调试的操作方法

    SpringBoot配置HTTPS及开发调试的操作方法

    在实际开发过程中,如果后端需要启用https访问,通常项目启动后配置nginx代理再配置https,前端调用时高版本的chrome还会因为证书未信任导致调用失败,通过摸索整理一套开发调试下的https方案,下面给大家分享SpringBoot配置HTTPS及开发调试,感兴趣的朋友跟随小编一起看看吧
    2024-05-05

最新评论