使用相应的专用"properties"文件进行设置时覆盖单个弹簧"beans"属性值(使用 @PropertySource)



我正在尝试使用它们的专用属性文件(来自"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

因此,请小心您的属性命名为全球唯一。

对于现有属性,请查看常见应用程序属性

相关内容

最新更新