SpringBoot如何启动自动加载自定义模块yml文件(PropertySourceFactory)

 更新时间:2024年07月10日 09:00:27   作者:君哥聊编程  
这篇文章主要介绍了SpringBoot如何启动自动加载自定义模块yml文件(PropertySourceFactory),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

参考:https://deinum.biz/2018-07-04-PropertySource-with-yaml-files/

背景

自定义模块时经常会编写当前模块的一些核心yml配置,如果要被Spring容器加载到通常的做法是将自定义模块的yml命名为application-模块名.yml,比如db模块命名为application-db.yml,然后再在spring.profiles.include中引入该db,即可加载到子模块配置(前提是maven构建时能够将resources资源目录编译进去)。

上面说的这种限制有很多,子模块对于父模块是黑箱操作,我们无法得知有多少个子模块要被include进来,而且前缀必须以application开头。

今天我们来看另外一种更加灵活的方式,自定义名称的yml直接在子模块中加载,各位朋友继续往下看PropertySourceFactory如何实现。

总结3步走

定义一个YamlPropertySourceFactory,实现PropertySourceFactory,重写createPropertySource方法

将接口给过来的资源流文件使用加载到spring提供的YmlPropertiesFactorBean中,由该工厂Bean产出一个Properties对象

将生成的Properties对象传入PropertiesPropertySource中产出一个PropertySource对象

import lombok.AllArgsConstructor;
import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.core.env.PropertiesPropertySource;
import org.springframework.core.env.PropertySource;
import org.springframework.core.io.support.EncodedResource;
import org.springframework.core.io.support.PropertySourceFactory;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;

/**
 * @description:
 * @author: jianjun.ren
 * @date: Created in 2020/9/24 12:05
 */
@AllArgsConstructor
public class YamlPropertySourceFactory implements PropertySourceFactory {
	//这个方法有2个入参,分别为资源名称和资源对象,这是第一步
    public PropertySource< ? > createPropertySource(String name, EncodedResource resource) throws IOException {
    
    	//这是第二步,根据流对象产出Properties对象
        Properties propertiesFromYaml = loadYamlIntoProperties(resource);
        String sourceName = name != null ? name : resource.getResource().getFilename();
        assert sourceName != null;
        
        //这是第三部,根据Properties对象,产出PropertySource对象,放入到Spring中
        return new PropertiesPropertySource(sourceName, propertiesFromYaml);
    }

    private Properties loadYamlIntoProperties(EncodedResource resource) throws FileNotFoundException {
        try {
            YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
            factory.setResources(resource.getResource());
            factory.afterPropertiesSet();
            return factory.getObject();
        } catch (IllegalStateException e) {
            Throwable cause = e.getCause();
            if (cause instanceof FileNotFoundException) {
                throw (FileNotFoundException) e.getCause();
            }
            throw e;
        }
    }
}

创建咱们是说完了,小伙伴有很多问号,怎么去使用呢?

接下来我们再看康康:

在任意一个@Configuration类中,你自己写一个也可以,反正能够被Spring所扫描的

加入下面这段代码,其实就一行:

@Configuration
//这个地方的YamlPropertySourceFactory就是上面编写的代码类
@PropertySource(factory = YamlPropertySourceFactory.class, value = "classpath:xxx-xxx.yml")
public class XXXXConfiguration {
		
}

最后

好了到这里就结束了,去使用看看效果吧~

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java递归实现斐波那契数列

    Java递归实现斐波那契数列

    这篇文章主要为大家详细介绍了Java递归实现斐波那契数列,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • Java 中 Date 与 Calendar 之间的编辑与转换实例详解

    Java 中 Date 与 Calendar 之间的编辑与转换实例详解

    这篇文章主要介绍了Java 中 Date 与 Calendar 之间的编辑与转换 ,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-07-07
  • 详解Java前缀树Trie的原理及代码实现

    详解Java前缀树Trie的原理及代码实现

    Trie又被称为前缀树、字典树。Trie利用字符串的公共前缀来高效地存储和检索字符串数据集中的关键词,最大限度地减少无谓的字符串比较,其核心思想是用空间换时间。本文主要介绍了Trie的原理及实现,感兴趣的可以了解一下
    2022-11-11
  • 详解Intellij IDEA 2017 debug断点调试技巧(总结)

    详解Intellij IDEA 2017 debug断点调试技巧(总结)

    这篇文章主要介绍了详解Intellij IDEA 2017 debug断点调试技巧(总结),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • SpringBoot集成JWT实现Token登录验证的示例代码

    SpringBoot集成JWT实现Token登录验证的示例代码

    随着技术的发展,分布式web应用的普及,通过session管理用户登录状态成本越来越高,因此慢慢发展成为token的方式做登录身份校验,本文就来介绍一下SpringBoot集成JWT实现Token登录验证的示例代码,感兴趣的可以了解一下
    2023-12-12
  • Java函数式接口Supplier接口实例详解

    Java函数式接口Supplier接口实例详解

    这篇文章主要介绍了Java函数式接口Supplier接口实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • java实现验证码类生成中文验证码

    java实现验证码类生成中文验证码

    java实现的汉字输入验证码,主要包含两个类,一个是生成验证码,一个是判断验证码输入是否正确,实现原理非常简单,将汉字和干扰线生成图片并将汉字保存到session,前台获取每次生成验证码图片并用文本框值和session值比较,功能就怎么简单
    2014-01-01
  • Spring Boot Admin 的使用详解

    Spring Boot Admin 的使用详解

    这篇文章主要介绍了Spring Boot Admin 的使用详解,Spring Boot Admin 用于监控基于 Spring Boot 的应用,有兴趣的可以了解一下
    2017-09-09
  • MyBatis查询结果resultType返回值类型的说明

    MyBatis查询结果resultType返回值类型的说明

    这篇文章主要介绍了MyBatis查询结果resultType返回值类型的说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • 浅析Java中Split函数的用法技巧

    浅析Java中Split函数的用法技巧

    在java.lang包中也有String.split()方法,与.net的类似,都是返回是一个字符型数组,但使用过程中还有一些小技巧。以下我就为大家介绍,需要的朋友可以参考下
    2013-07-07

最新评论