2013-10-15 34 views
6

我正在使用@ContextConfiguration註釋來管理我的應用程序中的配置。創建這些配置以便它們只提供由給定模塊公開的bean。由於這個原因,給定模塊使用的一些bean不一定是直接導入的。例如:可以影響@ContextConfiguration中配置類的初始化順序嗎?

configuration --(use)--> module1 --(cannot @Import)--> database 
       \-(use)--------------------------------> database 

在也就是說,configuration使用module1這需要(但不能直接導入)數據庫配置。因此,configuration也使用database模塊。

但它看起來像導入解決的順序是非常隨機的。即使我用

@ContextConfiguration(classes={DatabaseConfig.class, Module1Config.class}) 

這將導致不確定的失敗在初始化(NoSuchBeanDefinitionException)。

是否有任何方式來影響bean初始化的順序?或者我應該創建一個覆蓋配置,沿着依賴配置嗎?但是在這種情況下,同樣的問題適用於@Import,因爲它必須確保加載依賴關係的順序。

回答

1

這個問題似乎源於春天的不同版本在同一時間可用。當代碼運行時,只有@Imports的一小部分通過org.springframework.context.annotation.ConfigurationClassParser.collectImports(‌​AnnotationMetadata, Set<Object>, Set<Object>)方法加載。當解析過程中執行被斷點暫停時,一切都運行良好。

只要多個版本的彈簧庫被清理了,問題就消失了。 (至少它在十幾次運行後沒有再次出現)

0

我認爲你應該使用@DependsOn註釋 - 它正是爲這種情況設計的。

+0

不幸的是,@DependsOn註釋只是使依賴顯式化,但不會導致回溯從其他配置中加載丟失的bean。 – allprog

+0

你嘗試解決什麼樣的實際問題,以及爲什麼你的依賴bean不應該被描述爲依賴配置(可能通過接口)? –

+0

如果我將DB配置包含在使用它的模塊的配置中,那麼將該數據庫定義更改爲其他內容是不可能的。例如,如果我想將我的單元測試集中到更高級別的模塊上,我會盡量避免加載數據庫,並嘗試儘快中斷依賴關係樹。要麼爲測試和生產創建不同的配置,要麼以專注的方式創建配置,並避免它們之間的導入依賴關係,這種方式在測試中可以選擇我加載的內容。 – allprog

相關問題