2013-01-08 60 views
4

我想弄清楚如何將屬性文件的值放入我的Spring環境屬性中。來自文件的彈簧環境屬性

這樣做會是這樣的預春季3.1方式:

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

    <bean id="myBean" class="com.whatever.MyBean"> 
    <property name="someValue" value="${myProps.value}" /> 
    <!-- etc --> 
    </bean> 

我也做到了這一點:

public class MyBean { 

    @Value(value = "#{myProps.value}") 
    private String someValue; 

} 

現在,我可以表面上由環境類上拉性,這看起來像是一種更簡潔的獲取屬性的方法,而不是在我的xml或我的bean本身中使用笨重的#{myProps.value}語法。

我在XML試過這樣:

<bean 
    class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer"> 
    <property name="location"> 
     <value>classpath:my.properties</value> 
    </property> 
</bean> 

但屬性不添加到環境。

據我所知,我可以使用PropertySource屬性,但我沒有做我的配置與註釋。

那麼如何設置我的bean/xml,以便我的道具中的變量設置在環境中可用?此外,我怎麼能注入這些值代入我的豆,而不必明確說「environmentInstance.getProperty(」 myProps.value「)

+1

也許我誤解了什麼環境購買我? –

+0

我編輯了答案 - 環境具有更廣泛的適用性,因爲它不僅適用於bean定義,還適用於其他諸如''聲明等內容。 –

回答

0

我的理解也是有點怪僻,但是這是我可以做什麼?

  1. 環境是一種方法來指示當前激活的配置文件(和型材是一種方法來有選擇地創建豆)
  2. PropertySources可以使用@PropertySource註釋相關聯,以一種環境和做到這一點的方式,存在不似乎是一個xml相當於這樣做
  3. 你的理解實際上AFAIK:當您聲明<context:property-placeholder時,佔位符將針對本地聲明的屬性解析屬性,並且可以對環境中聲明的屬性源進行回退,但環境本身不會使用新屬性進行修改。再次,將屬性添加到環境本身的唯一途徑似乎是通過@PropertySource註釋
1

對於Web應用程序

如果你想擁有環境前的XML bean定義填充被處理,你應該實現一個ApplicationContextInitializer(),如the Spring Source blog

<context-param> 
    <param-name>contextInitializerClasses</param-name> 
    <param-value>com.bank.MyInitializer</param-value> 
</context-param> 

描述這裏是前略加修改的版本從博客

public class MyInitializer implements 
     ApplicationContextInitializer<ConfigurableWebApplicationContext> { 
    public void initialize(ConfigurableWebApplicationContext ctx) { 
     ResourcePropertySource ps; 
     try { 
      ps = new ResourcePropertySource(new ClassPathResource(
        "my.properties")); 
     } catch (IOException e) { 
      throw new AssertionError("Resources for my.properties not found."); 
     } 
     ctx.getEnvironment().getPropertySources().addFirst(ps); 
    } 
    } 

對於獨立的應用程序

基本上同樣的事情,你可以修改AbstractApplicationContext直接

ResourcePropertySource ps; 
    try { 
     ps = new ResourcePropertySource(new ClassPathResource(
         "my.properties")); 
    }catch (IOException e) { 
       throw new AssertionError("Resources for my.properties not found."); 
    } 
    //assuming that ctx is an AbstractApplicationContext 
    ctx.getEnvironment().getPropertySources().addFirst(ps); 

P.S.的環境充足此答案的早期版本顯示了嘗試從Bean修改環境,但似乎是在SO上傳播的反模式,因爲當然您想要在之前填充環境屬性源列表,即使XmlBeanDefinitionReader開始處理XML使佔位符在<import/>聲明中工作。