我正在尝试使用它们的专用属性文件(来自"bean1.properties"的"bean1"和来自bean2.properties的"bean2"(初始化两个不同的弹簧豆(bean1和bean2(,bean1和2属性文件具有相同的"在此处输入代码",具有不同的值。但是通过尝试这样做,bean1 和 bean2 都只能通过 bean1.properties 中的"值"进行初始化(而 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.属性:
symbol=bean1symbol
tenor=bean1tenor
豆2.属性
symbol=bean2symbol
tenor=bean2tenor
我希望 bean1 和 bean2 属性根据其属性文件的相应值进行初始化,[当它们相同的键时]。
当我为 Bean1 和 Bean2 打印符号和期限时,符号和期限打印相同的值(来自 bean2.properties(。
问题出在春季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=
Spring 会将所有属性文件读取到同一个命名空间中 - 因此对于 bean2.properties 将在 bean1.properties 之后读取的情况,它将覆盖已经定义的属性。
因此,也许您可以将属性修改为如下所示:
bean1.symbol=bean1symbol
bean2.tenor=bean1tenor
bean2.symbol=bean2symbol
bean2.tenor=bean2tenor
或更简单:
symbol1=bean1symbol
tenor2=bean1tenor
symbol2=bean2symbol
tenor2=bean2tenor
因此,请小心您的属性命名为全球唯一。
对于现有属性,请查看常见应用程序属性