在设置相应的专用“属性”文件(使用@PropertySource)时,将覆盖各个单独的“ beans”属性值

时间:2019-04-17 04:52:06

标签: java spring-boot

我正在尝试使用其专用属性文件(来自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)。

2 个答案:

答案 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