我正在尝试在我的属性文件中加载所有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=
这是我正在尝试做的事情
@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
}
}
答案 0 :(得分:6)
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));
}
答案 1 :(得分:1)
您可以在EnumerablePropertySource中autowire
包含方法getPropertyNames()
答案 2 :(得分:0)
您可以在jdk api中查找课程Properties
并使用方法load(InputStream inStream)
InputStream in = new FileInputStream("your properties location");
Properties prop = new Properties();
prop.load(in);
ps:prop是HashTable的子类,不要忘记关闭流