ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

springBoot项目配置优先级

springBoot项目配置优先级 一、核心结论配置优先级最终生效顺序在Spring Cloud Nacos SpringBoot场景下需注意SpringBoot 2.4 需手动引入spring-cloud-starter-bootstrap依赖才能启用bootstrap上下文自定义配置若在多位置存在最终生效优先级从高到低为Program arguments命令行参数--keyvalue VM optionsJVM系统属性-Dkeyvalue 应用内外置的 application.properties/yml主上下文 Nacos 远端配置Bootstrap 阶段加载 应用内外置的 bootstrap.properties/ymlBootstrap 上下文 SpringBoot 内置默认配置示例验证假设自定义配置test.key在各位置的值如下bootstrap.propertiestest.key1Nacos 远端配置test.key2application.propertiestest.key3VM options-Dtest.key4Program arguments--test.key5最终生效值为5命令行参数。二、配置加载顺序的底层逻辑配置加载的核心是Spring Environment 层级配置源加载时机1. 两个核心上下文Spring Cloud 引入Bootstrap 上下文父上下文和主应用上下文子上下文加载顺序为Bootstrap 上下文优先加载负责拉取 Nacos 远端配置、加载本地bootstrap配置主应用上下文后加载负责加载application配置、系统属性、命令行参数等子上下文的配置会覆盖父上下文除非配置被标记为 “不可覆盖”。2. 完整加载顺序从低到高后加载覆盖先加载优先级配置源类型说明1SpringBoot 内置默认配置如server.port8080等框架默认值2PropertySource 注解加载的配置主上下文初始化时加载如PropertySource(classpath:custom.properties)3jar 内的 bootstrap.properties/ymlBootstrap 上下文加载父上下文4jar 外的 bootstrap.properties/ymlBootstrap 上下文加载父上下文外部配置优先于内部5Nacos 远端配置Bootstrap 阶段拉取覆盖本地 bootstrap 配置6jar 内的 application.properties/yml主上下文加载子上下文覆盖父上下文7jar 外的 application.properties/yml主上下文加载外部配置优先于内部8系统环境变量如 OS 的TEST_KEYxxx9VM optionsJVM 系统属性-Dtest.keyxxxSystem.getProperties()10Program arguments命令行参数--test.keyxxx最高优先级三、源码验证方法通过跟踪Environment初始化过程和配置源加载逻辑可验证优先级1. 核心类 / 方法关键断点位置功能核心类 / 方法SpringBoot 启动入口org.springframework.boot.SpringApplication#run()环境初始化org.springframework.boot.SpringApplication#prepareEnvironment()Bootstrap 上下文触发org.springframework.cloud.bootstrap.BootstrapApplicationListener监听ApplicationEnvironmentPreparedEvent事件创建 Bootstrap 上下文Nacos 配置加载org.springframework.cloud.alibaba.nacos.client.NacosPropertySourceLocator#locate()拉取 Nacos 配置并添加到 Environment配置源加载org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor#process()加载 application/bootstrap 配置2. 实操验证步骤步骤 1打印 Environment 的配置源顺序在启动类 / 配置类中注入Environment打印所有配置源及对应配置值import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.MutablePropertySources; import org.springframework.core.env.PropertySource; SpringBootApplication public class ConfigDemoApplication implements CommandLineRunner { Autowired private ConfigurableEnvironment env; public static void main(String[] args) { SpringApplication.run(ConfigDemoApplication.class, args); } Override public void run(String... args) throws Exception { // 打印所有配置源的顺序和 test.key 的值 MutablePropertySources propertySources env.getPropertySources(); propertySources.forEach(ps - { String name ps.getName(); String value ps.getProperty(test.key) null ? null : ps.getProperty(test.key); System.out.printf(配置源%-30s | test.key %s%n, name, value); }); // 打印最终生效值 System.out.println(最终生效值 env.getProperty(test.key)); } }添加参数运行结果配置源server.ports | test.key null 配置源bootstrapProperties-null-security-out.properties,DEFAULT_GROUP | test.key null 配置源bootstrapProperties-null-custom-out.properties,DEFAULT_GROUP | test.key null 配置源bootstrapProperties-null-lettuceredis.properties,DEFAULT_GROUP | test.key null 配置源bootstrapProperties-null.properties,DEFAULT_GROUP | test.key null 配置源bootstrapProperties-DPP_UNION-DEV,DEFAULT_GROUP | test.key null 配置源configurationProperties | test.key 5 配置源commandLineArgs | test.key 5 配置源servletConfigInitParams | test.key null 配置源servletContextInitParams | test.key null 配置源systemProperties | test.key 4 配置源systemEnvironment | test.key null 配置源random | test.key null 配置源cachedrandom | test.key null 配置源springCloudClientHostInfo | test.key null 配置源Config resource class path resource [application-security-out.properties] via location optional:classpath:/ | test.key null 配置源Config resource class path resource [application-custom-out.properties] via location optional:classpath:/ | test.key null 配置源Config resource class path resource [application.properties] via location optional:classpath:/ | test.key 3 配置源springCloudDefaultProperties | test.key null 配置源Config resource class path resource [bootstrap.properties] via location optional:classpath:/ | test.key 1 配置源class path resource [application-impl.properties] | test.key null 配置源class path resource [application-xdm.properties] | test.key null 配置源class path resource [application.properties] | test.key 3 配置源class path resource [application_basic.properties] | test.key null 配置源Management Server | test.key null 最终生效值5步骤 2调试跟踪 Bootstrap 上下文加载断点打在BootstrapApplicationListener#onApplicationEvent观察 Bootstrap 上下文何时创建断点打在NacosPropertySourceLocator#locate观察 Nacos 配置何时被拉取并添加到 Environment对比 Bootstrap 上下文和主上下文的配置源顺序验证 “子覆盖父” 逻辑。四、其他常见配置文件 / 配置源除了bootstrap/application.properties/ymlSpringBoot 还支持以下配置形式1. 环境隔离配置文件命名规则application-{profile}.properties/yml如application-dev.yml、application-prod.yml激活方式spring.profiles.activedev优先级高于通用application.yml。2. 自定义命名 / 路径的配置文件自定义文件名--spring.config.namemyconfig加载myconfig.properties/yml自定义路径--spring.config.locationclasspath:/custom/,file:/opt/config/指定配置文件加载路径外部路径优先。3. 非文件类配置源PropertySource加载任意自定义配置文件如classpath:custom.properties系统环境变量如SPRING_APPLICATION_JSON{test.key:6}JSON 格式的环境变量JNDI 配置java:comp/env下的属性Servlet 上下文参数web.xml或ServletContextInitializer中配置的 init 参数DevTools 全局配置$HOME/.config/spring-boot/下的配置仅 DevTools 激活时生效。4. Nacos 特有配置多配置集通过spring.cloud.nacos.config.shared-configs/extension-configs加载共享配置命名空间 / 分组spring.cloud.nacos.config.namespace/group区分不同环境的配置配置自动刷新spring.cloud.nacos.config.refresh-enabledtrue修改 Nacos 配置后自动生效。五、关键注意事项SpringBoot 版本兼容2.4 移除了默认的 Bootstrap 上下文需引入spring-cloud-starter-bootstrap依赖才能使用bootstrap配置Nacos 覆盖规则可通过spring.cloud.nacos.config.override-nonetrue禁止本地配置覆盖 Nacos 配置命令行参数优先级--开头的命令行参数优先级最高生产环境需注意权限控制防止恶意参数覆盖配置刷新bootstrap配置默认不支持自动刷新需通过RefreshScope或重启应用application配置和 Nacos 配置支持自动刷新。
返回列表