2011-03-09 65 views
2

我正在修改在應用程序上下文文件中使用Spring PropertyPlaceholderConfigurer的代碼。這些屬性已成功讀取並在應用程序中使用。但是,如果我按照<import resource="classpath:/my/class/path/${my.file.name}" />的PropertyPlaceholderConfigurer聲明執行「Could not resolve placeholder 'my.file.name'」錯誤並引發一系列異常。聲明PropertyPlaceholderConfigurer後屬性是否立即可用?如果不是,它們在什麼時候變得可用?由Spring Property Placeholder讀取的屬性是否立即可用?

回答

2

在一個spring上下文文件中有多次傳遞,所以這是一個什麼傳遞屬性可用的問題。不幸的是,<import>標籤比bean聲明(例如PropertyPlaceholderConfigurer)更早處理,因此它不會以您嘗試使用它的方式提供。

你(有可能)試圖做的事情是Spring中常見的事情,有許多不同的解決方案。它們通常涉及修改您的構建以進行注入。谷歌搜索/堆棧溢出爲每個環境春天配置應該變成一些東西。我讀過Spring 3.1將提供一個工具來允許每個環境的配置(如果我正在做一個「測試」構建,那麼使用「this」屬性文件,如果我正在做一個「dev」構建等等) ,但在這一點上我不太瞭解它。

+0

這是在正確的軌道上。但是,導入語句實際上是在另一個上下文文件中讀取的。我的目標是根據my.file.name的值加載不同的上下文文件。每個上下文文件都有一個不同的底層緩存機制實現,與僅僅需要加載不同的屬性文件有點不同。有沒有更好的方法來做到這一點? – Adam

+0

我這樣做的方式是在過去它沒有將屬性定義爲導入xml的名稱,而是導入「所有」xml文件,然後有一個屬性定義要注入的bean的id 。所以你需要導入包含所有不同緩存機制的xml,然後實際被注入(和使用)的id由屬性定義。這不一定理想,但它確實完成了工作。 – Melv

+0

此方法是否最終在每個xml中實例化bean,而不管它們是否被使用? – Adam

3

導入資源在PropertyPlaceHolderConfigurer(BeanFactoryPostProcessor)解析屬性佔位符之前已解析。您必須將解析的資源名稱放入您的導入中。

因爲PropertyPlaceHolderConfigurer是BeanFactoryPostProcessor,所以在從Spring配置文件加載bean定義後調用它。

相關問題