java Spring是否将所有属性存储到单个散列表中?

jvidinwx  于 2022-12-28  发布在  Java
关注(0)|答案(1)|浏览(109)
    • Spring是否将所有属性放入同一个散列表中?**
    • 如何获得Spring管理的所有属性的列表**

例如,如果我有两个属性文件,它们定义了重叠的属性

// FILE: src/main/resources/file1.properties
prop1.color = red
prop1.fill  = green
// FILE: src/main/resources/file2.properties
prop2.color = purple
prop1.fill  = ORANGE

用于告诉Spring读取这两个文件的配置类如下所示:

@PropertySource("classpath:file1.properties")
@PropertySource("classpath:file2.properties")
@Configuration
public class MyConfig {
}
    • 我的问题是我可以得到一个迭代器来访问所有定义的属性吗?**如果可以,怎么做。

搜索答案

到目前为止我还没有找到这个问题的答案。
我在互联网上搜索了"堆栈溢出Spring属性",没有找到答案。
我发现的一些SO问题如下:

但他们没有回答我的问题

dxxyhpgq

dxxyhpgq1#

Spring提供了一个PropertySources接口,这个接口是由MutablePropertySources类实现的,这个类基本上只是保存了一个PropertySource示例的列表(例如PropertiesPropertySource类的示例),并提供了迭代这些示例的方法。
如果你看一下MutablePropertySources的实现,你会发现有多个方法可以在不同的位置添加PropertySource示例,并且相对于列表中的其他PropertySource。如果你想得到一个属性,MutablePropertySourcesget方法会被调用,它会迭代所有PropertySource,直到找到那个属性。
还有Environment接口,它是由抽象类AbstractEnvironment实现的,可以使用后者访问PropertySources示例。
例如,您可以执行以下操作:

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

    @Autowired
    public ExampleConfig(Environment environment) {
        AbstractEnvironment env = (AbstractEnvironment) environment;
        for (org.springframework.core.env.PropertySource<?> source : env.getPropertySources()) {
            if (source instanceof MapPropertySource mapPropertySource) {
                System.out.println(mapPropertySource.getSource());
            }
        }
    }
}

您可以查看包含所有这些类的org.springframework.core.env包。
为了更明确地回答你的第一个问题不,Spring不会把所有属性放到一个Map中,它会把不同位置的属性放到不同的PropertySource中,然后再添加到PropertySources示例中。

相关问题