2014-10-08 53 views
0

不確定這是最好的方法。我們創建了一個可供不同項目使用的jar。依賴這個jar的其他項目需要提供在其spring屬性文件中定義的某些屬性。 (我們的jar不應該在乎他們命名這些屬性文件。)從PropertySourcesPlaceholderConfigurer在Spring中運行時查找動態屬性?

使用@Value(「$ {some.prop}」)對大多數屬性都很好,但是現在我們需要屬性的名稱看起來是動態的。例如:

int val = getSomeVal(); 
String propNeeded = foo.getProperty("foo."+val+".dynamic.prop"); 

不知道什麼「富」應該是我的訪問。我看着注入環境,但是從我所有的googling看起來,它不會從XML屬性佔位符定義加載(即使定義爲PropertySourcesPlaceholderConfigurer的bean def)。您似乎必須使用@PropertySource,但我的主要配置是一個XML文件,所以不知道如何讓環境工作。 (我不能真的去'老skool'和查找屬性文件作爲類路徑資源,因爲我不知道用戶定義的文件的名稱。)

我不介意製作這個特殊的Service類ApplicationContextAware,但是如果我這樣做了,我怎樣才能訪問底層的PropertySourcesPlaceholderConfigurer?我會「看起來?」需要爲了動態訪問一個屬性?

另一種選擇是,我強迫罐子的用戶來聲明一個名字一個bean,我可以看一下

<util:properties id="appProps" location="classpath:application.properties" /> 

然後我注入appProps的屬性,並從那裏查找。我不喜歡這種方法,因爲它強制圖書館的用戶用一個公共的ID命名一個文件。我認爲最好的解決方案是以某種方式獲得一個句柄給我的服務類中的底層PropertySourcesPlaceholderConfigurer ......我只是不知道該怎麼做?

爲什麼不簡單地允許PropertySource通過你的XML配置來定義一些,然後我可以只注入Environment?

感謝您的任何建議如何實現我想要的。

回答

0

您可以聲明ReloadableResourceBundleMessageSource與PropertySourcesPlaceholderConfigurer從相同的源讀取。這樣,您可以只使用@Autowire MessageSource(或使您的bean實現MessageSourceAware)並使用它來檢索您的屬性。

使用ReloadableResourceBundleMessageSource的主要原因是檢索I18N消息,以便那種hacky ...

相關問題