如何在SpringBoot 2.0中加载外部覆盖属性文件?
在Spring Boot 2.0中加载外部/覆盖属性文件的方案
在Spring Boot 2.0里,加载外部属性或者覆盖默认配置的方式和1.5版本有不少变化——你之前用的PropertyPlaceholderConfigurer已经被标记为过时了,下面我给你梳理几种靠谱的实现方式:
1. 利用Spring Boot自带的外部配置优先级(最推荐,无需额外代码)
Spring Boot本身就有一套完善的外部配置加载优先级,外部配置文件里的相同key会自动覆盖内部配置,常用的方式有:
- 命令行参数指定路径:启动jar包时直接指定外部配置文件路径
如果不想完全替换默认配置路径,只是添加额外的外部配置,可以用java -jar your-app.jar --spring.config.location=file:/var/tmp/${spring.application.name}/${MYAPP_PROFILE:h2}/conf/override.propertiesspring.config.additional-location:java -jar your-app.jar --spring.config.additional-location=file:/var/tmp/your-app/conf/override.properties - 环境变量指定:通过设置环境变量来配置外部路径
export SPRING_CONFIG_LOCATION=file:/var/tmp/${spring.application.name}/${MYAPP_PROFILE:h2}/conf/override.properties java -jar your-app.jar - 默认目录自动加载:Spring Boot会自动扫描jar包所在目录下的
config/子目录,或者classpath:/config/目录,把这些目录下的配置文件加载进来,优先级高于classpath:/根目录的配置。
2. 使用@PropertySource结合Environment(替代过时的PropertyPlaceholderConfigurer)
在2.0版本中,官方不再推荐手动注册PropertyPlaceholderConfigurer,而是通过@PropertySource配合Environment或者@Value来处理属性。示例代码如下:
@Configuration @PropertySource(value = "file:/var/tmp/${spring.application.name}/${MYAPP_PROFILE:h2}/conf/override.properties", ignoreResourceNotFound = true) public class AppConfig { // 注入Environment来获取属性 @Autowired private Environment env; @Bean public YourCustomBean yourCustomBean() { YourCustomBean bean = new YourCustomBean(); // 从外部配置中获取属性值 bean.setSomeProperty(env.getProperty("your.custom.property")); return bean; } }
如果需要用@Value直接注入属性,也可以正常使用,Spring会自动解析@PropertySource加载的配置:
@Value("${your.custom.property}") private String someProperty;
3. 使用@ConfigurationProperties实现类型安全的属性绑定(Boot 2.x推荐方式)
这种方式更适合复杂的配置场景,能把属性绑定到一个实体类中,类型更安全,也更便于管理:
@Configuration @PropertySource(value = "file:/var/tmp/${spring.application.name}/${MYAPP_PROFILE:h2}/conf/override.properties", ignoreResourceNotFound = true) @ConfigurationProperties(prefix = "your.app") public class AppProperties { // 对应override.properties里的your.app.title属性 private String title; // 对应your.app.max-count属性 private Integer maxCount; // 生成getter和setter方法 public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public Integer getMaxCount() { return maxCount; } public void setMaxCount(Integer maxCount) { this.maxCount = maxCount; } }
然后需要在你的Spring Boot主类上添加@EnableConfigurationProperties注解来启用这个配置类:
@SpringBootApplication @EnableConfigurationProperties(AppProperties.class) public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }
之后就可以在任何需要的地方注入AppProperties来使用属性了:
@Autowired private AppProperties appProperties; // 使用属性 public void someMethod() { String title = appProperties.getTitle(); // ... }
注意事项
@PropertySource中的占位符(比如${spring.application.name})需要确保已经被加载,你可以在内部的application.properties中定义,或者通过命令行参数、环境变量传入。- 外部配置的优先级:命令行参数 > 环境变量 > 外部配置文件 > 内部配置文件,所以相同key的属性,外部的会覆盖内部的。
内容的提问来源于stack exchange,提问作者Espresso
相关产品推荐
相关产品推荐

