2014-12-02 131 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