2011-07-25 51 views
1

我使用spring與我的應用程序,我可以從類路徑中的某個文件注入一些屬性到我的應用程序中,並且一切正常。即如何從主類中將屬性注入到spring bean中

<bean class="org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer"> 
     <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /> 
     <property name="searchContextAttributes" value="true" /> 
     <property name="contextOverride" value="true" /> 
     <property name="ignoreResourceNotFound" value="true" /> 
     <property name="locations"> 
      <list> 
       <value>classpath:application.properties</value> 
      </list> 
     </property> 
    </bean> 

現在我可以在我的春天環境中使用${any.property.from.application.properties}。而在我的主類:

ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("appContext.xml"); 

它的工作原理,以及,我的問題是我怎麼注入的春天上下文屬性文件的位置,沒有它,首先在那裏,我要讓我的應用程序配置。如果我從C:\dir/user/home/dir執行我的應用我認爲在應用程序上下文的值應爲C:\application.properties/user/home/dir/application.properties

回答

2

我以前有過類似的問題。我的要求是屬性文件沒有捆綁在應用程序內(因此不在classpath中)。該文件可能位於文件系統中的任何位置。 這裏是我如何解決它,

  1. 定義一個環境變量,其值指向的application.properties的位置。
  2. 假設我們有一個環境變量APP_PROP_HOME與價值/用戶/家庭/ DIR/
  3. 現在在定義ServletContextPropertyPlaceholderConfigurer,定義位置如下

我重用你的榜樣

<bean class="org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer"> 
     <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /> 
     <property name="searchContextAttributes" value="true" /> 
     <property name="contextOverride" value="true" /> 
     <property name="ignoreResourceNotFound" value="true" /> 
     <property name="locations"> 
      <list> 
       <value>file://${APP_PROP_HOME}/application.properties</value> 
      </list> 
     </property> 
    </bean> 

Spring將$ {APP_PROP_HOME}解析爲存儲在相應env屬性中的值,並且您的應用程序在運行時進行配置。

0

如果我正確地讀你的問題,你想使用外部屬性文件(即文件是不在應用程序運行時類路徑中)。如果是這樣的話,你需要使用的文件標籤

<value>file:///c:\application.properties</value> 
+0

我將如何將此注入Main類的應用程序上下文中? – London

+0

你可以使用這樣的東西來注入一個屬性位置,確保你將這個屬性添加到屬性中,你可以這樣做:PropertyPlaceholderConfigurer configurer =(PropertyPlaceholderConfigurer)ctx.getBean (PropertyPlaceholderConfigurer.class); \t \t資源rsc = new FileSystemResource(「file:/// C:\\ Applications \\ one.properties」); \t \t configurer.setLocation(rsc);我不確定你爲什麼要這樣做,但是如果你在spring容器啓動後注入屬性文件,你不能在上下文文件中使用屬性。 –

0

您可以使用@Value從ENV注入值。例如:

private someFoo; 

@Value("${systemProperties.someFoo}") 
public void setSomeParam(String someParam) { 
    this.someFoo = someParam; 
} 
+0

我無法在我的PostConstructionHook中得到這個工作訪問這些變量的要求是什麼? –

相關問題