2014-12-02 132 views
1

我不知道是否有方法从属性实例的形式从Spring环境中提取属性(例如从ApplicationContext获取)?或者,至少有没有办法在Spring Environment中枚举属性,或者将它们全部作为地图,或者我可以将[最初未知]属性集合转换为Properties对象的任何其他方式?获取弹簧环境作为属性

我需要此功能才能创建jclouds Context,请致电org.jclouds.ContextBuilder.newBuilder().overrides(Properties)。我们的想法是仅通过.properties文件配置实际的云提供程序,而我不希望将应用程序逻辑与提供程序特定的属性相耦合。

[UPDATE]

要使用利用<context:property-placeholder>被配置.properties文件,它实际上指定的路径的列表,这样的:

< context:property-placeholder location= 
    "classpath:/jdbc.properties, 
    file:${jboss.server.config.dir}/jdbc.properties, 
    file:${catalina.home}/conf/jdbc.properties" 
    ignore-resource-not-found="true"/> 

这表明的.properties文件将按顺序在所提及的位置列表中进行搜索。我想达到以下目的:

  • 保留.properties文件的列表及其可能的位置在这个XML定义文件中;
  • 允许在XML中提到的.properties文件的任何中放置与jcloud相关的属性;
  • 以Properties对象的形式访问由Spring解析和加载的属性,所以我可以将它提供给jclouds ContextBuilder

请让我知道,如果这一切都是可行的。先谢谢你!

-Vlad

回答

1

如果您wan't在你的Spring配置文件来使用属性,那么你可以简单地使用:

<context:property-placeholder location="classpath:foo.properties" /> 

为了让你的代码的属性后,你可以简单地从该文件读取类路径转换为Properties对象:

props.load(MyClass.class.getClassLoader().getResourceAsStream("foo.properties")); 

或者,您可以查看PropertyPlaceholderConfigurer

UPDATE

更新Deinum的言论之后,但只有当你正在从一个Spring属性管理的bean:

<util:properties id="myProps" 
      location="classpath:foo.properties"/> 
<context:property-placeholder properties-ref="myProps" /> 

现在,你可以注入myProps到Spring管理的bean(无需加载他们再次从类路径)。

+1

为什么这么“复杂”。您可以简单地使用''来读取属性,这些属性又可以被注入到''元素中。保存你加载文件两次。 – 2014-12-02 12:09:04

+1

Deinum,你说得对,但那只能从Spring管理的bean中工作。由于OP似乎是自己创建这个对象(newBuilder()),所以这是行不通的。 – 2014-12-02 12:13:51

+0

他需要那些应该注入的属性,他们如何阅读应该无关紧要。阅读应该是,imho,外化。 – 2014-12-02 12:14:47

0

你可以使用PropertiesFactoryBean,做这样的事情:

<bean id="jcloudsProps" 
    class="org.springframework.beans.factory.config.PropertiesFactoryBean"> 
    <property name="location"> 
    <value>your/props/file.properties</value> 
    </property> 
</bean> 

然后可以使用jcloudsProps,就像任何其他的Spring bean。

+0

是否可以将此bean引用到现有的元素中?此外,您是否可以为位置指定多个值? – 2014-12-02 15:22:09