Java “单个弹簧”;豆子“;属性值在使用相应的“专用”设置时被覆盖;物业;文件(使用@PropertySource)

Java “单个弹簧”;豆子“;属性值在使用相应的“专用”设置时被覆盖;物业;文件(使用@PropertySource),java,spring-boot,Java,Spring Boot,我正试图用它们的专用属性文件(“bean1.properties”中的“bean1”和“bean2.properties”中的“bean2”)初始化两个不同的SpringBean(bean1和bean2),其中bean1和2个属性文件具有相同的“entercode here”和不同的值。但是通过尝试这样做,bean1和bean2都只通过bean1.properties中的“值”进行初始化(而忽略bean2.properties) 演示代码已打开 基本上使用@PropertySource从类路径加

我正试图用它们的专用属性文件(“bean1.properties”中的“bean1”和“bean2.properties”中的“bean2”)初始化两个不同的SpringBean(bean1和bean2),其中bean1和2个属性文件具有相同的“entercode here”和不同的值。但是通过尝试这样做,bean1和bean2都只通过bean1.properties中的“值”进行初始化(而忽略bean2.properties)

演示代码已打开

基本上使用@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打印symbol和tenor时,symbol和tenor打印相同的值(来自Bean2.properties)

问题在于Spring
环境中的属性名冲突。您正在使用告知Spring从其他位置获取属性,但这些属性将进入相同的
环境

相反,请尝试在*.properties文件中为属性添加前缀,并使用来消除同名属性的歧义

例如:

@组件
@PropertySource(“类路径:bean1.properties”)
@配置属性(前缀=“bean1”)
@配置
公共类Bean1{
私有字符串符号;
私人弦乐男高音;
//省略代码
}
@组成部分
@PropertySource(“类路径:bean2.properties”)
@配置属性(前缀=“bean2”)
@配置
公共类Bean2{
私有字符串符号;
私人弦乐男高音;
//省略其他代码
}
然后在*.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
因此,请注意,您的属性名称是全局唯一的


对于已经存在的属性,请查看

如何与我们共享一个最小的示例或代码片段?所有代码都已添加到github(上面的链接)。无论如何,为引用更新了一些代码片段我猜spring将两个属性文件引入同一名称空间,因此当bean2.properties在bean1.properties之后读取时,它会覆盖属性定义。在这之后,属性将应用于bean。如果它已经按照上述方法工作,我们正在寻找替代方案的可能性,但看起来这是Spring工作方式中固有的。谢谢你的解释很高兴解释有帮助。请考虑将它标记为你的问题的答案,以便更好地帮助他人解决同样的问题。