如何在属性文件中加载所有键/值对

Saj*_*jad 3 java spring properties spring-boot

我正在尝试将所有key/value对加载到我的属性文件中。

一种方法是我使用@Value手动加载所有属性,但为此我应该知道所有键。

我无法执行此操作,因为将来可能会更改属性文件以包含更多key/value对,因此可能需要code再次修改以容纳它们。

第二种方法是,我应该了解一些如何加载属性文件并对其进行迭代以加载所有key/value对,而无需知道键。

说我有以下属性文件 sample.properties

property_set.name="Database MySQL"
db.name=
db.url=
db.user=
db.passwd=

property_set.name="Database Oracle"
db.name=
db.url=
db.user=
db.passwd=
Run Code Online (Sandbox Code Playgroud)

这是我想要做的

@Configuration
@PropertySource(value="classpath:sample.properties")
public class AppConfig {
    @Autowired
    Environment env;

    @Bean
    public void loadConfig(){
    //Can I some how iterate over the loaded sampe.properties and load all
    //key/value pair in Map<String,Map<String, String>>
    // say Map<"Database MySQL", Map<key,vale>>
    // I cannot get individual properties like env.getProperty("key"); 
    // since I may not know all the keys
}
}
Run Code Online (Sandbox Code Playgroud)

Ken*_*kov 6

Spring将所有属性存储在中EnvironmentEnvironment包含的集合PropertySource。每个都PropertySource包含来自特定来源的属性。有系统属性和Java环境属性等。文件的属性也将在那里。

任何来源都有自己的名称。在您的情况下,自动生成的名称将如下所示"class path resource [sample.properties]"。如您所见,该名称并不是很方便。因此,让我们设置更方便的名称:

@PropertySource(value="classpath:sample.properties", name="sample.props")
Run Code Online (Sandbox Code Playgroud)

现在,您可以使用以下名称获取源:

AbstractEnvironment ae = (AbstractEnvironment)env;
org.springframework.core.env.PropertySource source =
                              ae.getPropertySources().get("sample.props");
Properties props = (Properties)source.getSource();
Run Code Online (Sandbox Code Playgroud)

请注意,我指定了PropertySource类的全名,以避免与@PropertySource注释类冲突。之后,您可以使用属性。例如,将它们输出到控制台:

for(Object key : props.keySet()){
   System.out.println(props.get(key));
}
Run Code Online (Sandbox Code Playgroud)


Joh*_*erg 1

您可以autowire在包含该方法的EnumerablePropertySource中getPropertyNames()