Spring Boot中如何让@PropertySource外部配置优先级高于profile配置
问题原因
Spring Boot 默认的配置加载优先级中,项目内置的application.properties(包括对应不同profile的application-{profile}.properties)优先级高于@PropertySource注解引入的外部配置,因此你当前的写法会优先读取项目内的配置值。
可行方案
方案1:调整@PropertySource的优先级(适配你当前注解引入的写法)
通过自定义上下文初始化器,手动将外部配置源调整到配置列表的最前端,获得最高优先级:
- 先给
@PropertySource指定自定义名称,方便后续定位配置源:
@PropertySource(name = "externalHashiCorp", value = "${path}", ignoreResourceNotFound = true) public class MyApplication { public static void main(String[] args) { SpringApplication application = new SpringApplication(MyApplication.class); // 注册自定义初始化器 application.addInitializers(new CustomPropertySourceInitializer()); application.run(args); } }
- 实现自定义初始化器:
public class CustomPropertySourceInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> { @Override public void initialize(ConfigurableApplicationContext context) { ConfigurableEnvironment env = context.getEnvironment(); PropertySource<?> externalSource = env.getPropertySources().get("externalHashiCorp"); if (externalSource != null) { // 将外部配置源移到最前面,优先级最高 env.getPropertySources().addFirst(externalSource); } } }
方案2:使用Spring Boot原生参数指定外部配置(更简单,无需修改代码)
不用@PropertySource注解,直接在启动时通过spring.config.additional-location参数指定外部配置路径,该参数引入的配置默认优先级高于项目内置的profile专属配置:
java -jar 你的应用jar包名称.jar --spring.config.additional-location=file:/你的外部配置文件完整路径
两种方案均可实现外部配置的name=updatedNewValue覆盖项目内置的name=value。
内容的提问来源于stack exchange,提问作者Swetha R Naik
相关产品推荐
相关产品推荐

