gpt4 book ai didi

java - 如果在多个属性文件中定义了一个属性,Spring 如何选择要使用的属性值?

转载 作者:行者123 更新时间:2023-12-02 01:24:57 26 4
gpt4 key购买 nike

如果一个属性在多个属性文件中定义,Spring 如何决定该变量的值应该是什么?

我的猜测

基于运行一些代码,我相信结果是不确定的。如果多个属性文件定义相同的属性名称,那么使用哪个属性文件似乎是随机的。

Spring 如何实现这个(我的猜测)

Spring 保留一个 PropertySource 列表,当需要属性值时,它会逐一遍历 PropertySource,直到找到属性的值。

这是基于我所做的一些测试和这个答案:来自 https://stackoverflow.com/a/74934269/3281336其中说:

If you want to get a property, the get method of the MutablePropertySources is called which iterates over all PropertySources until it finds that property.

由于默认情况下,您不知道列表的顺序,因此,您不知道将获得什么值(当在多个属性文件中定义属性时)。

我如何向自己证明这一点

为了向自己证明这是如何工作的,我创建了两个属性文件并定义了相同的属性名称 foo.baz。见下文:

// File: src/main/resources/file1.properties
foo.baz=Defined in file1.properties

// File: src/main/resources/file2.properties
foo.baz=Defined in file2.properties

接下来,我创建了一个 @ConfigurationMyConfig,它读取两个属性文件 file1.propertiesfile2.properties.

@PropertySource("classpath:datasource.properties")
@PropertySource("classpath:file1.properties")
@PropertySource("classpath:file2.properties")
@Configuration
public class MyConfig{

此类有一个 bean,将在应用程序启动时创建,并且它将打印 Spring 为属性 foo.baz 选择的值。代码是:

    @Bean
public Object whichProp(@Value("${foo.bar}") String fooBar, @Value("${foo.baz}") String fooBaz){
System.out.println("Looks like foo.bar prop is set to " + fooBar + ", foo.baz=" + fooBaz);
return new Object();
}

我得到的结果是:

Looks like foo.bar prop is set to defined in application.properties, foo.baz=Defined in file2.properties

我还编写了一个 @Bean 来转储/显示 Spring 属性列表 ( based on this answer )。

    @Bean
public Object DisplayPropertiesEnvironment(Environment environment) {
AbstractEnvironment env = (AbstractEnvironment) environment;
for (org.springframework.core.env.PropertySource<?> source : env.getPropertySources()) {
if (source instanceof MapPropertySource) {
MapPropertySource mapPropertySource = (MapPropertySource) source;
System.out.println("Prop: " + source.getName() + "=" + mapPropertySource.getSource());
}
}
return new Object();
}

结论

我分享了我的信念并给出了理由。请告诉我答案。另外,如果有一个 Spring 文档的 URL 来解释它是如何工作的请分享。

最佳答案

Spring 将始终按照文件列出的顺序读取文件。这是因为 @Repeatable 的性质注解,Spring 不会搞乱这一点。即,多个相同的注释实际上是可重复的注释。在这种情况下,PropertySources .

因此,在您的示例中,file1.properties 中的值将覆盖 datasource.propertiesfile2.properties 中的值将覆盖 datasource.propertiesfile1.properties .

关于java - 如果在多个属性文件中定义了一个属性,Spring 如何选择要使用的属性值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74935768/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com