springboot2.7.x 系列之配置文件加载

张开发
2026/4/15 21:18:03 15 分钟阅读

分享文章

springboot2.7.x 系列之配置文件加载
Spring Boot 配置文件加载深度剖析prepareEnvironment方法1. 核心结论SpringApplication#prepareEnvironment是 Spring Boot 启动过程中环境准备的核心阶段负责加载和合并所有配置源如application.yml,bootstrap.yml, 环境变量, 命令行参数等构建最终的Environment对象。关键点配置加载顺序命令行参数 application.properties/yml 系统环境变量 操作系统环境。Bootstrap 上下文在 Spring Boot 2.4 中bootstrap.yml的加载依赖于spring-cloud-starter-bootstrap依赖它通过独立的 Bootstrap 上下文在主应用上下文之前加载。Nacos 集成Nacos 配置中心通过PropertySourceLocator机制将远程配置动态注入到Environment中。2. 方法执行时序图StandardEnvironmentNacosConfigServiceBootstrapContextConfigFileApplicationListenerprepareEnvironment()SpringApplication.run()StandardEnvironmentNacosConfigServiceBootstrapContextConfigFileApplicationListenerprepareEnvironment()SpringApplication.run()alt[存在 spring-cloud-starter-bootstrap]1. 创建并准备环境2. 创建 StandardEnvironment3. 加载系统属性和环境变量4. 触发 ApplicationEnvironmentPreparedEvent5. 加载 application.yml/properties6. 创建 Bootstrap 上下文7. 加载 bootstrap.yml8. 从 Nacos 拉取配置9. 返回配置10. 将 Nacos 配置注入到 Environment11. 返回准备好的 Environment3. 详细步骤解析3.1 创建与初始化环境 (prepareEnvironment)// SpringApplication.javaprivateConfigurableEnvironmentprepareEnvironment(SpringApplicationRunListenerslisteners,DefaultBootstrapContextbootstrapContext,ApplicationArgumentsapplicationArguments){// 1. 创建 Environment (根据 WebApplicationType)ConfigurableEnvironmentenvironmentgetOrCreateEnvironment();// 2. 配置 Environment (转换命令行参数为 PropertySource)configureEnvironment(environment,applicationArguments.getSourceArgs());// 3. 触发监听器加载配置文件 (如 application.yml)listeners.environmentPrepared(environment);// 4. 将 Environment 绑定到 SpringApplicationreturnenvironment;}关键动作getOrCreateEnvironment: 根据应用类型Servlet/Reactive/None创建StandardServletEnvironment或StandardReactiveWebEnvironment。configureEnvironment: 将命令行参数--server.port8080转换为CommandLinePropertySource并添加到Environment的PropertySources列表头部优先级最高。3.2 配置文件加载 (ConfigFileApplicationListener)listeners.environmentPrepared(environment)会触发ConfigFileApplicationListenerSpring Boot 2.4 中为ConfigDataEnvironmentPostProcessor负责加载application.yml/properties。加载逻辑搜索路径默认搜索classpath:/,classpath:/config/,file:./,file:./config/。文件名默认搜索application可通过spring.config.name修改。Profile 激活根据spring.profiles.active加载特定环境的配置如application-dev.yml。合并顺序后加载的配置会覆盖先加载的配置PropertySource列表顺序决定优先级。3.3 Bootstrap 上下文与 Nacos 集成当引入spring-cloud-starter-bootstrap时Spring Cloud 会创建一个独立的 Bootstrap 上下文其加载逻辑如下Bootstrap 上下文创建在SpringApplication#run方法早期通过BootstrapApplicationListener创建。父上下文为null独立于主应用上下文。加载bootstrap.ymlBootstrap 上下文通过ConfigFileApplicationListener加载bootstrap.yml优先级高于application.yml。4. 配置优先级总结最终Environment中的PropertySource优先级从高到低命令行参数(CommandLinePropertySource)Nacos 配置(NacosPropertySource) - 如果存在application-{profile}.yml- 特定环境配置application.yml- 默认配置bootstrap.yml- Bootstrap 配置系统环境变量(SystemEnvironmentPropertySource)系统属性(SystemPropertiesPropertySource)6. 总结prepareEnvironment是配置加载的入口负责初始化Environment并触发监听器。Bootstrap 上下文通过独立机制加载bootstrap.yml和 Nacos 配置优先级高于application.yml。Nacos 集成通过PropertySourceLocator动态注入远程配置实现配置的集中管理。配置优先级由PropertySource列表顺序决定命令行参数 Nacos application.yml 系统属性。通过以上机制Spring Boot 实现了灵活的配置管理支持本地文件、远程配置中心、环境变量等多种配置源的动态加载与合并。

更多文章