2016-11-25 51 views
1

我想讓我的彈簧引導配置類別A依賴於另一個配置類別B,即A配置僅在評估B配置時才被評估。如何以另一種配置爲條件進行配置?

在現實情況下,我有數以百計的Ai配置只有一個B,我想實現一個方法只B在測試過程中排除,排除所有Ai CONFIGS。

我試過如下:

@Configuration 
@ConditionalOnBean(type = "org.my.B") 
public class A1AutoConfiguration { 
// ... 
} 

B無條件配置類。

但是當我運行mvn spring-boot:run -Ddebug=true我看到A不會求因爲B丟失。雖然B內部創建的bean在應用程序上下文中,但B本身不是。

不過,我覺得我可以讓Ai配置類依賴於內部B創建咖啡豆,但我不喜歡那麼多這種解決方案。

是否有更清潔(和工作)的方式來實現這種依賴機制?

+0

我不明白這裏有什麼問題,你讓所有的Ai都依賴於B,並且沒有B,因爲你明確地排除了B,所以它們沒有加載。這不是預期的行爲嗎?你想做什麼? –

+0

不,他們被排除**總是**,而不僅僅是當我禁用'B'。 –

回答

2

關鍵是要確保事物的順序正確。如果你不能確定B首先被評估,那麼請求A僅在B存在時才適用。

數以百計的部分讓我有點害怕。如果由於和B是自動配置,您可以使用以下

@AutoconfigureAfter(B.class) 
@ConditionalOnBean(B.class) 
public class A123AutoConfiguration { ...} 

如果由於和B不是自動配置,你需要確保B先處理,所以你不能依靠常規的類路徑掃描對於那些。

+0

謝謝,這在我的情況下工作,但它並不總是工作。當將「A123AutoConfiguration」放置在主模塊中而不是具有「spring.factory」文件的外部模塊時,它無法找到B並且失敗,併發生缺少bean錯誤。 –

+0

如果你想我可以分享一個例子來顯示問題。 –

+0

如果不在類路徑中,可以使用字符串。但這也很奇怪。如果我誤解了它,它應該在那裏,是的樣本會幫助 –