[英]Spring 3.1 PropertySourcesPlaceholderConfigurer and conditional import
看看3.1中的新Spring屬性支持( http://blog.springsource.org/2011/02/15/spring-3-1-m1-unified-property-management/ ),看起來應該是可行的:
<context:property-placeholder location="/WEB-INF/application-customer-dev.properties,classpath:application-customer.properties" ignore-resource-not-found="true"/>
<import resource="classpath*:com/x/core/security/security-${login.security}.xml"/>
其中login.security位於application-customer-dev.properties中:
login.security=dev
(並且security-dev.xml確實存在於適當的位置)。 我錯過了一些東西,因為login.security無法解決。 我期望在3.1之前的版本中出現這種行為,但看起來這應該對3.1(我們正在使用)有效嗎?
您的鏈接的腳注[2]:
[2]:因為在調用BeanFactoryPostProcessors之前必然會處理<import/>
元素,這意味着甚至PropertyPlaceholderConfigurer在這里也無法提供幫助。 由於環境及其PropertySources集在容器刷新之前配置,因此可以針對環境解析元素中的占位符,而不會出現任何生命周期問題。
更新 :
根據PropertySourcesPlaceholderConfigurer的javadoc , PropertySourcesPlaceholderConfigurer
是一個BeanFactoryPostProcessor
,因此腳注的真正含義是在安裝PropertySourcesPlaceholderConfigurer 之前解析導入,因此它也不起作用 (實際上,在<import/>
被解析時) ,配置器可能還沒有存在!)是的,當它安裝時它將查看Environment
,但你不能用它來解析<import/>
內部,因為當時沒有后處理器可操作。 這包括PropertySourcesPlaceholderConfigurer
。
基本上Spring XML上下文設置或多或少像這樣:
Environment
已經確定。 BeanFactoryPostProcessor
,處理bean定義。 BeanPostProcessor
已安裝。 這是一個類似的問題,導致您無法使用許多后處理器的order
屬性在BeanFactoryPostProcessor
之前應用BeanPostProccesor
(執行類似於使PropertyPlaceholderConfigurer
從@PersistenceContext
解析占位符):在Spring應用程序中對行為進行硬編碼上下文,所以你必須通過專門化一些Spring類來解決它。
我認為你錯誤地閱讀了博客@Kurt - 如果在開始創建bean定義之前包含屬性的屬性源存在,則應該解決它。
因此,導入解析的方法有以下兩種方式:1。使用此參數設置環境變量(-Dlogin.security=dev)
,默認情況下將注冊為屬性源
2.以編程方式將文件注冊為屬性源,在博客文章中提到通過編寫自定義ApplicationContextInitializer來注冊屬性源 - 您應該能夠使用ResourcePropertySource來注冊基於文件的屬性源
現在,通過@Inject Environment
和使用配置文件,您應該更容易。 您不應該替換部分文件名。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.