2013-03-07 82 views
1

我需要知道如何在spring配置文件中動態注入依賴。舉個例子,我有一個叫做'A類'的業務邏輯類。在該類中,它處理一個名爲「doSomething()」的方法。 根據應用程序,該方法可以以兩種不同的方式執行(對於相同方法,兩種類型的實現)。所以我用這個方法聲明瞭一個名爲'Manager'的接口,併爲同一接口創建兩個實現類。讓我們稱他們爲'Impl1'和'Impl2',它們實現了界面'經理'。在彈簧配置文件中動態依賴注入

Interface Manager{ 
void doSomething(); 
} 

Class Impl1 implements Manager{ 

public void doSomething(){ 
    //doIt like this way 
} 

Class Impl2 implements Manager{ 

public void doSomething(){ 
    //doIt like that way 
} 
} 

A類對「經理」接口的引用稱爲「經理」,它將在部署時通過Spring DI進行設置。該注入可以是Impl1對象或Impl2對象。它將由最終用戶決定。所以我必須給最終用戶提供兩種選擇,他或她可以決定他或她想要處理這種「doSomething()」方法的方式,根據他或她的選擇,我將注入相關的實現類(Impl1或Impl2 )。

Class A{ 

private Manager manager; //this can be either Impl1 or Impl2 

public void setManager(Manager manager){ 
    this.manager = manager; 
} 

public void performLogic(){ 
    manager.doSomething(); 
} 
} 

最終用戶只有一次機會做出這樣的選擇和應用程序後,除非用戶想重新安裝應用程序的全新副本將使用該執行下去。如何根據用戶在spring xml文件中的選擇動態地注入相關實現。處理這種情況的最佳方法是什麼?想法是受歡迎的。

非常感謝!

+0

只想說 - 解決方案使用@Profiles更可取 – 2013-03-07 11:38:59

+0

嗨,是的,但我覺得@profile更適合大規模。我只需要在兩個類之間切換隻爲整個應用程序。所以我發現Nandkumar Tekale的回答很適合我的情況。 btw感謝您的支持! – 2013-03-07 11:45:29

回答

1

那你覺得像下面的東西:

Class A{ 

@Autowired 
@Qualifier("Impl1") 
private Manager manager1; // Impl1 

@Autowired 
@Qualifier("Impl1") 
private Manager manager2; // Impl2 

// getter setter for manager1 and manager2 

public void performLogic(){ 
    getUserChoiceManager().doSomething(); 
} 

private Manager getUserChoiceManager() { 
    // return manager according to user choice 
} 
} 
+0

感謝Nandkumar Tekale爲您的答案!我決定採用這個解決方案。非常感謝。 – 2013-03-07 11:36:34

5

您需要使用Spring profiles

使用兩個配置文件,將每個實現包裝到其中的一個。然後在開始時激活一個配置文件(例如使用系統屬性)。

+0

感謝您的回答!我找到了另一種方法來做到這一點。檢查接受的答案。 – 2013-03-07 11:38:54

+1

是的,但在Qualifier解決方案的情況下,您的應用程序將創建並處理2個bean。在配置文件的情況下 - 只有一個需要。 – 2013-03-07 11:40:06

+5

你可能已經採用了另一種方法,但這並不能回答這個問題,因爲它不是「動態」的。那個給你兩個靜態實例,每個管理器類型一個。 [用於@Qualifier的字符串甚至不能是環境變量或任何靈活的東西。] Spring配置文件可能不是您的實現選擇,但它是您的問題的答案。 – JoeG 2013-04-03 20:07:25