java - 如何加载属性文件中的所有键/值对

标签 java spring properties spring-boot

我正在尝试加载我的属性文件中的所有键/值 对。

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

我不能这样做,因为将来可能会更改属性文件以包含更多的 key/value 对,我可能需要再次修改 code 以容纳它们.

第二种方法是我应该知道如何加载属性文件并迭代它以在不知道键的情况下加载所有键/值对。

假设我有以下属性文件 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=

这是我想做的

@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
}
}

最佳答案

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

任何来源都有自己的名字。在您的情况下,自动生成的名称将类似于 "class path resource [sample.properties]"。如您所见,这个名字不太方便。所以让我们设置更方便的名称:

@PropertySource(value="classpath:sample.properties", name="sample.props")

现在您可以通过此名称获取源:

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

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

for(Object key : props.keySet()){
   System.out.println(props.get(key));
}

关于java - 如何加载属性文件中的所有键/值对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34652661/

相关文章:

java - Eclipse使用Java 9显示空错误消息

java - String = 运算符引用或在这种情况下创建新的 String 对象

java - 将事件添加到日历时设置事件的颜色

java - 每分钟都会调用远程 Web 服务,而无需我调用它们

objective-c - 错误 : "Unrecognized selector" when using addObjects: on an NSMutableArray

java - 尝试将字符串转换为整数

java - 使用NamedParameterJdbcTemplate时出现异常

java - 存在任何 <jaxws :endpoint/> annotation?

python - 在 Python 中从 __init__ 调用 setter

c# - Setter 在构造函数之前调用