簡體   English   中英

Spring 3.1 PropertySourcesPlaceholderConfigurer和條件導入

[英]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集在容器刷新之前配置,因此可以針對環境解析元素中的占位符,而不會出現任何生命周期問題。

更新

根據PropertySourcesPlaceholderConfigurerjavadocPropertySourcesPlaceholderConfigurer是一個BeanFactoryPostProcessor ,因此腳注的真正含義是安裝PropertySourcesPlaceholderConfigurer 之前解析導入,因此它也不起作用 (實際上,在<import/>被解析時) ,配置器可能還沒有存在!)是的,當它安裝時它將查看Environment ,但你不能用它來解析<import/>內部,因為當時沒有后處理器可操作。 這包括PropertySourcesPlaceholderConfigurer

基本上Spring XML上下文設置或多或少像這樣:

  1. 上下文已創建。
  2. Environment已經確定。
  3. 讀取XML(所有XML,必要時解析導入)。 Bean定義已創建。
  4. 安裝並調用BeanFactoryPostProcessor ,處理bean定義。
  5. BeanPostProcessor已安裝。
  6. Bean根據bean定義進行實例化。 應用BeanPostProcessors。

這是一個類似的問題,導致您無法使用許多后處理器的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM