我有一個需要有條件地建立的,這取決於在運行時Spring應用程序檢測到環境中的服務的三種可能的實現方式之一。如果服務A可用,那麼我想創建一個使用服務A作爲依賴項的具體實現類。如果服務A不可用,那麼我想創建一個使用服務B作爲依賴項的實現。等等。彈簧自動裝配基於服務的可用性
類依賴於實施,將自動裝配接口並不太在乎得到了什麼選擇的基本服務,對於特定的環境。
我第一次嘗試這種做法是實現多個@Bean方法,根據服務是否可用返回一個bean或null,然後有一個單獨的@Configuration類@Autowire(required = false)兩個可能的服務,根據哪個@Autowired字段不是null來有條件地創建實現。
這裏的問題是,需要= FALSE時,春天似乎並不關心它是否等待周圍將建造候選人;也就是說,嘗試選擇實現的類可能會在構建required或false Beans之前被構造,從而確保其中一個或兩個可能始終爲空,無論它是否可以正確初始化。
它那種感覺就像我逆着在這一點糧食,所以我需要建議的「正確」的方式做這樣的事情,在這裏一整套豆可能會切換出基於某些外部服務或環境的可用性。
型材不喜歡看正確的答案,因爲我不知道,直到後,我的服務豆嘗試初始化我想選擇哪一個實現;我在創建背景時當然不會知道它。
@Order沒有任何實現的目標。 @Conditional並沒有對這個bean的存在進行測試(因爲它還沒有被構造)。與FactoryBean同樣的問題 - 檢查FactoryBean被要求創建實例時可能沒有構建的Bean的存在沒有意義。
我真正需要做的是基於其他豆類的可用性創建一個bean,但前提是這些bean有至少有機會嘗試初始化。
你可以多說一下這三種實現是什麼? –
舉一個具體的例子,根據可用性,我可能有一個外部的Redis緩存,一個內存中的羣集Hazelcast緩存,或者如果這兩個都不可用,那麼只是一個啞巴的本地HashMap(回退)。 根據我的具體情況,我將構建一個服務接口的具體實現,該接口知道如何獲取/放置由任何可用服務提供的特定bean。 –
所以我可能會喜歡做的是一樣的東西: 如果(Redis的豆)返回RedisImpl(Redis的豆) 否則,如果(hazelcast豆)返回HazelImpl(hazelcast豆) 否則返回DumbHashImpl() –