2011-12-31 50 views
1

理想我想從代碼做到這一點:春PropertiesFactoryBean自動公開提供一個PropertyPlaceholderConfigurer的財產

@Value("#{aPropertiesFactoryBean.aProperty}") 
private String aProperty; 

基礎上,我設置了提供一個PropertyPlaceholderConfigurer和PropertiesFactoryBean彈簧的配置,只是通過配置bean作爲bean的引用,並且配置器生成的所有內容都作爲工廠bean的屬性公開。

有一個黑客,只是重新定義每個屬性從配置者,如:

<bean id="aPropertiesFactoryBean" 
     class="org.springframework.beans.factory.config.PropertiesFactoryBean"> 
    <property name="singleton" value="true" /> 
    <property name="properties"> 
     <props> 
     <prop key="aProperty">${aProperty}</prop> 
     </props> 
    </property> 
</bean> 
每次一個屬性添加到配置者時間

然後,你必須用的FactoryBean,再暴露了。值得一提的是,我需要配置器的所有管理功能,並且還能夠從spring xml文件和@Value批註中引用同一批屬性。

所以兩個問題:

  1. 有這樣的開箱即用的?
  2. 它看起來很容易覆蓋PropertiesFactoryBean並給它一個PlaceholderConfigurer的屬性,但實際訪問這些屬性的代碼將不得不涉及通過反射來解開引擎並挖入Spring的內部PropertiesLoaderSupport類。有沒有更簡單的方法來做到這一點?

請注意,我不是在尋找能夠快速讓我走上前路的東西,現在上面的PropertiesFactoryBean已經足夠了。我正在尋找或者找出一個可重用的組件,我可以用它來輕鬆管理路上的項目的注入屬性。

回答

3

我只是在想這個倒退。這個配置完全符合我的要求,可以在xml配置中定義屬性,可以覆蓋屬性文件,並且可用作佔位符屬性和注入值。

<beans 
    xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans   
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> 

    <!-- 
    One-stop shopping for properties here. 
    Available as injected values and elsewhere in the spring config. 
    --> 
    <bean id="injectableProperties" 
      class="org.springframework.beans.factory.config.PropertiesFactoryBean">   
      <property name="singleton" value="true" /> 
      <property name="ignoreResourceNotFound" value="true" /> 
      <property name="properties"> 
      <props> 
       <prop key="prop1">value1</prop> 
       <prop key="prop2">value2</prop>    
      </props> 
      </property> 
      <!-- Allow foo.conf to override default properties --> 
      <property name="location" value="file:/etc/foo/foo.conf" /> 
    </bean> 

    <!-- Expose the properties so other parts of the spring config can use them --> 
    <bean id="propertyPlaceholderConfigurer" 
     class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="ignoreResourceNotFound" value="true" /> 
    <property name="ignoreUnresolvablePlaceholders" value="false" /> 
    <property name="properties" ref="injectableProperties"/> 
    </bean> 
</beans> 
0

也許我誤解的情況,但你可以不必使用語法來定義一個PropertiesFactoryBean注入性質:

@Value("${my.property}") String myProperty;