在我的春季项目中,我有两个不同的conf文件具有相同的属性。
其中一个位于外部目录中,而另一个位于我项目的资源中。
我希望外部文件的属性覆盖内部值(如果它们存在于外部文件中)。
在我的配置类中,我使用PropertySource注释设置文件:
@PropertySources(
{ @PropertySource("file:${HOME}/conf/application.properties"),
@PropertySource("classpath:/data.properties")
})
答案 0 :(得分:2)
默认情况下,PropertySource的工作方式如下: - 阅读第一个属性文件 - 读取第二个(...)属性文件 - 如果它包含已经给定的键,它将被覆盖。
在此处查看:http://javapapers.com/spring/spring-properties-with-propertysource-annotation/
如果您想将其与XML一起使用,请查看以下答案:What is property resolution order in Spring property placeholder configurer with multiple locations?
答案 1 :(得分:2)
假设你正在使用spring-boot并且有一个胖胖的可执行jar, 您可以使用外部命令行参数覆盖内部配置文件属性,如下所示
java -jar your-executable-fat-jar.jar --spring.config.name=external-prop-file-name --spring.config.location=classpath:/application.properties,file://<external-config-file-parent-dir-path-NOT-EXTERNAL-CONFIG-FILE-PATH>
其中
spring.config.name - external config file name
spring.config.location - Locations to look for configuration files
注意:使用上面的配置,spring-boot将在spring.config.location
答案 2 :(得分:0)
声明文件的顺序很重要。如果在两个或多个文件中定义了相同的键,则与最后声明的文件中的键关联的值将覆盖任何先前的值。
来自spring docs:
如果给定的属性键存在于多个.properties文件中,则处理的最后一个@PropertySource批注将“赢”&#39;和覆盖。
所以只需与@PropertySource("file:${HOME}/conf/application.properties")
@PropertySource("classpath:/data.properties")
即可
示例:强>
@PropertySources({@PropertySource("classpath:/data.properties"),@PropertySource("file:${HOME}/conf/application.properties")})