游乐游手机版
首页/AI教程/文章详情

Spring Boot配置加载过程详解

时间:2026-06-11 16:47
SpringBoot配置加载由ConfigFileApplicationListener监听应用环境准备事件触发,通过SPI从spring factories获取所有环境后处理器,排序后依次调用,添加随机值属性源,再由配置加载器加载application properties与application yml等配置文件,并解析属性、处理占位符,最终成功完成配置

在Spring Boot的启动流程中,配置文件的加载工作是由ConfigFileApplicationListener负责执行的。该监听器通过监听容器启动时的特定事件,在恰当的时机触发配置加载流程。通俗地说,当运行环境准备就绪后,它便会立即开始运作。

spring boot 配置的加载过程

我们先来看核心代码——ConfigFileApplicationListener同时实现了EnvironmentPostProcessorSmartApplicationListenerOrdered三个接口。它主要监听两个事件:ApplicationEnvironmentPreparedEvent(应用环境准备事件)和ApplicationPreparedEvent(应用准备事件)。当ApplicationEnvironmentPreparedEvent事件被触发时,它会调用onApplicationEnvironmentPreparedEvent方法;当ApplicationPreparedEvent事件发生时,则会调用onApplicationPreparedEvent方法。

public class ConfigFileApplicationListener implements EnvironmentPostProcessor, SmartApplicationListener, Ordered {

    @Override
    public void onApplicationEvent(ApplicationEvent event) {
        if (event instanceof ApplicationEnvironmentPreparedEvent) {
            onApplicationEnvironmentPreparedEvent((ApplicationEnvironmentPreparedEvent) event);
        }
        if (event instanceof ApplicationPreparedEvent) {
            onApplicationPreparedEvent(event);
        }
    }

    private void onApplicationEnvironmentPreparedEvent(ApplicationEnvironmentPreparedEvent event) {
        // 从spring.factories中获取所有的EnvironmentPostProcessor
        List postProcessors = loadPostProcessors();
        // 当前对象也是一个EnvironmentPostProcessor
        postProcessors.add(this);
        // 排序
        AnnotationAwareOrderComparator.sort(postProcessors);
        for (EnvironmentPostProcessor postProcessor : postProcessors) {
            // 加载配置
            postProcessor.postProcessEnvironment(event.getEnvironment(), event.getSpringApplication());
        }
    }

    /**
     * 当前EnvironmentPostProcessor的处理逻辑
     */
    @Override
    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
        addPropertySources(environment, application.getResourceLoader());
    }

    protected void addPropertySources(ConfigurableEnvironment environment, ResourceLoader resourceLoader) {
        RandomValuePropertySource.addToEnvironment(environment);
        // new一个loader(在spring.factories文件中找到所有的PropertySourceLoader,
        // 如properties,yml文件的Loader[PropertiesPropertySourceLoader,YamlPropertySourceLoader])并load
        new Loader(environment, resourceLoader).load();
    }
}

为什么选择监听特定事件?因为Spring Boot的配置加载必须在环境就绪之后、Bean初始化之前完成。因此,ApplicationEnvironmentPreparedEvent事件是一个非常自然的切入点。整体代码逻辑相当清晰:首先通过loadPostProcessors()方法从spring.factories文件中获取所有注册的EnvironmentPostProcessor实例;接着把自己也加入列表(因为自身也实现了该接口);然后按照优先级进行排序;最后依次调用每个postProcessEnvironment方法。每个EnvironmentPostProcessor都可以向环境中添加自己的属性源,而ConfigFileApplicationListener在该方法中主要完成两件事:先添加一个RandomValuePropertySource(随机值属性源),再通过内部的Loader加载真正的配置文件。

这里的Loader扮演着关键角色。它会在spring.factories中查找所有可用的PropertySourceLoader实现——例如PropertiesPropertySourceLoader负责解析.properties文件,YamlPropertySourceLoader负责解析.yml文件。随后,Loader会按照约定的路径(如application.ymlapplication.properties以及profile相关的变体)进行加载,最终将解析出的键值对放入环境对象中。整个加载过程体现了“事件驱动 + SPI机制 + 约定优于配置”的经典设计思路。

有趣的是,ConfigFileApplicationListener本身也会作为一个EnvironmentPostProcessor被调用,因此它的postProcessEnvironment方法是整个配置加载流程中至关重要的一环。如果你仔细阅读Spring Boot的源码,会发现这种设计模式非常常见:一个类同时扮演监听器和执行器的角色,通过事件机制将自己串联到正确的生命周期节点上,从而高效地完成配置加载任务。

来源:https://developer.aliyun.com/article/704619
上一篇年测试预测分析及全面成本效益深度解析 下一篇大数据基建如何迈向AI基础设施(下)
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
微软Copilot插件安装全流程:浏览器与扩展市场配置
AI教程 · 2026-07-01

微软Copilot插件安装全流程:浏览器与扩展市场配置

围绕MicrosoftCopilot在浏览器、编辑器和扩展市场中的安装与配置,梳理账号准备、安装步骤、权限检查、常见故障及安全使用边界,适合新手快速完成AI办公工具部署。

Microsoft Copilot Docker 一键部署指南:镜像拉取、端口映射与数据目录配置
AI教程 · 2026-07-01

Microsoft Copilot Docker 一键部署指南:镜像拉取、端口映射与数据目录配置

围绕Copilot类AI办公工具的Docker部署流程,说明镜像选择、拉取校验、端口映射、数据目录挂载、环境变量配置、更新回滚与常见故障处理。

微软Copilot API密钥注册获取与国内网络配置
AI教程 · 2026-07-01

微软Copilot API密钥注册获取与国内网络配置

围绕MicrosoftCopilot相关接口接入流程,梳理账号准备、Azure资源创建、密钥获取、环境变量配置、国内网络连通性优化、常见报错处理与安全管理要点。

微软Copilot Linux部署:环境准备到后台运行全流程
AI教程 · 2026-07-01

微软Copilot Linux部署:环境准备到后台运行全流程

MicrosoftCopilot不适合按本地模型方式安装,Linux服务器更常见的是部署企业入口或集成服务。流程需完成账号授权、运行环境、服务配置、反向代理、进程守护与日志监控,并注意数据权限、访问控制和合规边界。

Microsoft Copilot macOS安装教程:Apple Silicon与Intel配置步骤
AI教程 · 2026-07-01

Microsoft Copilot macOS安装教程:Apple Silicon与Intel配置步骤

MicrosoftCopilot在Mac上可通过网页应用、Edge侧边栏或Microsoft365组件使用,AppleSilicon与Intel机型重点在系统版本、浏览器、账号授权和隐私设置。