2014-02-22 31 views
2

假設我有一個HigherLevelBean,它取決於LittleServiceLittleService是兩個實現的接口。Spring - 兩種實現之間的運行時間選擇

沒有靜態或半靜態的方式來判斷應該使用哪個實現,它們都是動態的(事實上會話範圍)。當來自此用戶的請求使用LegacyLittleService時,並且來自該其他用戶的請求使用NewShinyLittleService

服務不會那麼小。他們將擁有自己的依賴關係,需要注入,他們可能來自兩個不同的應用程序環境。考慮在兩種不同的模式/數據模型上使用一個應用程序。

我該如何實現這種運行時動態?理想情況下使用註釋驅動配置。我有什麼選擇,他們的優點和缺點?

+0

我不明白的東西 - 你知道在啓動時你需要哪個依賴嗎? – Avi

+0

@Avi - 不,它不是靜態的。同時,我可能會服務於兩個不同用戶的請求,每個用戶使用不同的實現。 –

回答

0

你可以簡單地有一個工廠,其中兩個服務注入:

@Component 
public class LittleServiceFactory { 
    @Autowired 
    private LegacyLittleService legacy; 

    @Autowired 
    private NewShinyLittleService newShiny; 

    @Autowired 
    private TheSessionScopedBean theSessionScopedBean; 

    public LittleService get() { 
     if (theSessionScopedBean.shouldUseLegacy()) { 
      return legacy; 
     } 
     else { 
      return newShiny; 
     } 
    } 
} 

現在注入這家工廠任何你想要的,並調用get()來訪問相應的LittleService實例。

+0

不錯,但有兩個問題:1.如果我有10種服務類型,我需要有10個這樣的工廠。 2.我不確定是否希望這些服務能夠處於相同的應用程序環境中。它在這裏變得有趣,歸結爲父母意識到並在兩個孩子情境之間進行選擇。 –

+0

你明白了。您也可以實現一個實現LittleService的代理,並根據會話作用域bean委託給NewShiny的Legacy。你甚至不需要工廠。但是這個想法基本上是一樣的:你注入兩個實現,並根據會話作用域bean選擇正確的實現。 –

+0

嗨。請看看這個問題,並幫助我。 http://stackoverflow.com/questions/29765870/passing-session-factories-from-one-service-to-another我試圖用同樣的方法來實現它。 – KarthickN