我正在尝试使用其专用属性文件(来自bean1.properties的'bean1'和来自bean2.properties的'bean2')初始化两个不同的spring bean(bean1和bean2),同时使用bean1和2属性文件具有相同的“在此处输入代码”但值不同。但是,通过尝试这样做,仅通过bean1.properties中的“值”来初始化bean1和bean2(而忽略bean2.properties)。
演示代码位于GitHub
上基本上使用@PropertySource从类路径中加载相应的属性文件。
@Component
@PropertySource("classpath:bean1.properties")
@ConfigurationProperties
public class Bean1 {
private String symbol;
private String tenor;
// omitting code
}
@Component
@PropertySource("classpath:bean2.properties")
@ConfigurationProperties
public class Bean2 {
private String symbol;
private String tenor;
// omitting other code
}
bean1.properties:
symbol=bean1symbol
tenor=bean1tenor
bean2.properties
symbol=bean2symbol
tenor=bean2tenor
我希望bean1和bean2属性基于它们的属性文件的相应值(当它们具有相同的键时)进行初始化。
当我为Bean1和Bean2打印符号和男高音时,符号和男高音正在打印相同的值(来自bean2.properties)。
答案 0 :(得分:1)
问题出在Spring Environment
中,属性名称冲突。您正在使用@PropertySource
告诉Spring从其他位置获取属性,但是这些属性将进入相同的Environment
。
相反,请尝试在* .properties文件中添加属性前缀,并使用@ConfigurationProperties(prefix = "my.prefix")
来消除具有相同名称的属性的歧义。
例如:
@Component
@PropertySource("classpath:bean1.properties")
@ConfigurationProperties(prefix = "bean1")
@Configuration
public class Bean1 {
private String symbol;
private String tenor;
//omitting code
}
@Component
@PropertySource("classpath:bean2.properties")
@ConfigurationProperties(prefix = "bean2")
@Configuration
public class Bean2 {
private String symbol;
private String tenor;
//omitting other code
}
然后在您的* .properties文件中,您将拥有:
bean1.symbol=
bean1.tenor=
bean2.symbol=
bean2.tenor=
答案 1 :(得分:1)
Spring会将所有属性文件读入相同的名称空间-因此,对于在bean1.properties之后读取bean2.properties的情况,它将覆盖已经定义的属性。
因此,也许您可以将属性修改为如下名称:
bean1.symbol=bean1symbol
bean2.tenor=bean1tenor
bean2.symbol=bean2symbol
bean2.tenor=bean2tenor
或更简单:
symbol1=bean1symbol
tenor2=bean1tenor
symbol2=bean2symbol
tenor2=bean2tenor
所以请小心,您的属性命名为全局唯一。
对于已经存在的属性,请查看Common application properties