2012-11-15 24 views
0

我們對我們的配置文件有一個特定的格式,而不是具有多個文件 - 即dev.properties,uat.properties,prod.properties - 我們改爲在一個文件中包含所有值,但用每個環境的前綴分隔。例如:Can PropertiesPlaceholderConfigurer子類檢測活動的Spring配置文件?

SERVICE_PORT = 9800

DEV_SERVICE_PORT = 7800

UAT_SERVICE_PORT = 6600

我們有一個查找這些值,並決定什麼前綴添加現有的類(PropertyPlaceholderConfigurer的子類)在resolvePlaceHolder()內部,根據它正在執行的IP地址,即對於某個IP範圍,使用DEV_前綴,對於另一個使用UAT_前綴。然後將這些值傳遞給其他bean,在某些情況下使用上下文xml,並在某些bean構造函數中使用@ Value $ {}註釋。前綴的使用是透明的,因此所有其他配置將使用SERVICE_PORT(在此示例中)

我們想要更改此設置,以便不使用IP,而只是檢測活動的Spring配置文件。我們在web.xml中有一個自定義的ApplicationContextIniitalizer,用於檢測指示我們的環境類型的java系統屬性。

我遇到的問題是在resolvePlaceHolder()被調用的時候,似乎沒有任何活動配置文件了!我「在做檢測活動的配置文件是:

  1. 創建StandardEnvironment的實例
  2. 調用getActiveProfiles()

(2)似乎總是返回一個空數組這意味着。這是否正確?

什麼時候設置活動配置文件,相對於Spring上下文加載期間的其他事件,如創建bean,加載屬性文件等?

是否有可能在resolvePlaceHolder()被調用時檢測活動配置文件?我應該擴展另一個班級嗎?一個ApplicationContext內管理

回答

1

豆可以註冊爲 EnvironmentAware@Inject環境以查詢簡檔 狀態或直接解析性能。

[來源:Environment javadocs]

不要創建的StandardEnvironment一個實例,它注入到你的豆!

+0

我實現了'EnvironmentAware'並且可行!我現在可以獲得活動的配置文件。謝謝肖恩! 「@ Inject」方法似乎不起作用。試圖使用'@ Autowired',它也沒有工作。 – trafalmadorian