您现在的位置是:首页 > 编程 > 

SpringBoot如何加载外部自定义的配置文件

2025-07-23 14:44:10
SpringBoot如何加载外部自定义的配置文件 一、前言你是否有想过,acos、Cul是如何成为配置中心的,Spring是如何读取到这些外部的配置文件的呢?我之前就有这个疑问,直到上次看了一篇博客,解决MyBatisPlus的数据源加密放在acos的问题在文档中,它获取了一个bean,就是acosPropertySourceLocator,在这段代码中,获取到acos上的数据源密文

SpringBoot如何加载外部自定义的配置文件

一、前言

你是否有想过,acosCul是如何成为配置中心的,Spring是如何读取到这些外部的配置文件的呢?

我之前就有这个疑问,直到上次看了一篇博客,解决MyBatisPlus的数据源加密放在acos的问题

在文档中,它获取了一个bean,就是acosPropertySourceLocator,在这段代码中,获取到acos上的数据源密文,然后进行解密,最后组装返回了PropertySource对象。之后就能成功获取到解密后的数据源了,Mybatis也就能正常使用了。

而在acosPropertySourceLocator其中,我发现了它实现了PropertySourceLocator,在一番摸索之下,我明白了,这就是Spring加载外部配置文件的关键。

那么本文,将会实现这个接口,完成加载外部自定义配置文件到服务之中,我们就简单点,用本地的一个文件来代替。

二、源码

按照惯例,先看看这个接口,里面定义了什么方法

代码语言:java复制
package org.;
​
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collecti;
import java.util.List;
​
import org.CompositePropertySource;
import org.Environment;
import org.PropertySource;
​
public interface PropertySourceLocator {
​
    PropertySource<?> locate(Environment environment);
​
    default Collection<PropertySource<?>> locateCollection(Environment environment) {
        return locateCollection(this, environment);
    }
​
    static Collection<PropertySource<?>> locateCollection(PropertySourceLocator locator, Environment environment) {
        PropertySource<?> propertySource = locator.locate(environment);
        if (propertySource == null) {
            return ();
        }
        if (isInstance(propertySource)) {
            Collection<PropertySource<?>> sources = ((CompositePropertySource) propertySource).getPropertySources();
            List<PropertySource<?>> filteredSources = new ArrayList<>();
            for (PropertySource<?> p : sources) {
                if (p != null) {
                    filteredSources.add(p);
                }
            }
            return filteredSources;
        }
        else {
            return Arrays.asList(propertySource);
        }
    }
​
}

一个方法locate(),返回了PropertySource,另一个是默认的方法可以返回PropertySource的集合

源码非常简单,下面我们去实现一下这个接口

三、代码

那么我们只需要实现这个方法就好了

代码语言:java复制
package com.banmoon.;
​
import cn.io.resource.ResourceUtil;
import lombok.SneakyThrows;
import slf4j.Slf4j;
import org..PropertySourceLocator;
import org.annotation.Configuration;
import org.annotation.Order;
import org.Environment;
import org.MapPropertySource;
import org.PropertySource;
import org.yaml.snakeyaml.Yaml;
​
import java.io.BufferedReader;
import java.util.Map;
​
@Slf4j
@Order(0)
@Configuration
public class CustomPropertySourceLocatorConfig implements PropertySourceLocator {
​
    @Override
    @SneakyThrows
    public PropertySource<?> locate(Environment environment) {
        BufferedReader reader = ResourceUtil.getUtf8Reader("D:\\test.yaml");
        Yaml yaml = new Yaml();
        Map<String, Object> yamlMap = yaml.loadAs(reader, );
        return new MapPropertySource("customYaml", yamlMap);
    }
}

非常简单,就是读取yaml文件,然后生成一个PropertySource返回出去

现在,我们准备一下test.yaml,我们将它放到D盘下,里面就简单放两个参数

代码语言:javascript代码运行次数:0运行复制
user:
  name: 半月无霜
  age: 18

接下来,就是编码了,我们搞简单点,就直接在Main启动类上添加读取上面文件的配置信息

代码语言:java复制
package com.banmoon;
​
import slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.ConfigurableApplicationContext;
import org.Environment;
import org.springframework.scheduling.annotation.EnableScheduling;
​
import java.util.Map;
​
@Slf4j
@EnableScheduling
@SpringBootApplication
public class WebBaseMain {
​
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(, args);
        Environment environment = context.getBean();
        Map<String, Object> map = environment.getProperty("user", );
        log.info("user: {}", map);
    }
​
}

但我执行后,没有效果?怎么回事,我寻了半天,

原来就算添加了@Configuration,将此类注册成为一个配置bean,但由于这里面没有什么bean需要注册的,所以也就是相当于一个空壳。所以这边还需要添加SPISpring将其自动注册成为一个配置类,就能去处理了。

spring.factories文件上添加

image-2025010724848405
代码语言:yaml复制
org.bootstrap.BootstrapConfiguration=\
  com.banmoon..CustomPropertySourceLocatorConfig

只要加上了,原本CustomPropertySourceLocatorConfig类上的@Configuration也不需要了

此时此刻,我们再启动服务,查看效果

image-2025010725056849
四、最后

好的,由于时间紧迫,上面的代码还是有点小瑕疵;后续想想如何改进一下

希望可以通过本篇文章,对PropertySourceLocator这个接口有一个初步的认知,

再次说明,必须要在spring.factories添加类,加注解是没有用的,这是springSPI机制

后面看情况会出篇这样的文章,看看spring是如何通过这种方式加载bean

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1191853.html

相关标签:无
上传时间: 2025-07-22 23:33:30
留言与评论(共有 8 条评论)
本站网友 怎样查看网速
23分钟前 发表
Cul是如何成为配置中心的
本站网友 心律平
25分钟前 发表
本站网友 朱婧
7分钟前 发表
Object> map = environment.getProperty("user"
本站网友 万达公馆
21分钟前 发表
前言你是否有想过
本站网友 分析家数据下载
19分钟前 发表
将此类注册成为一个配置bean
本站网友 沈醉简介
20分钟前 发表
它获取了一个bean
本站网友 羊肉不能和什么一起吃
28分钟前 发表
就是编码了