2013-04-18 110 views
2

我的問題已經在下面的鏈接中提到。Spring使用多個實現接口的依賴注入

Spring: Why do we autowire the interface and not the implemented class?

我想知道,如果我們使用@Qualifier注入一個bean比什麼是自動裝配接口的目的是什麼?我們爲什麼不自動連線相同的實現類?

通過自動裝配接口,我們希望利用運行時多態性,但如果我們遵循@Qualifier的方法,則無法實現這一點。請給我一個標準的方法。

以下是簡單的代碼,如果我沒有彈簧。我不知道春天將如何注入PrepaidPaymentService實例和PostPaidPaymentService實例?

public interface PaymentService{ 
     public void processPayment(); 
    } 



public class PrepaidPaymentService implements PaymentService{ 

    public void processPayment(){ 

     System.out.println("Its Prepaid Payment Service"); 

    } 
} 


public class PostPaidPaymentService implements PaymentService{ 

    public void processPayment(){ 

     System.out.println("Its Postpaid Payment Service"); 

    } 
} 


public class Test { 


    public PaymentService service; 

    public static void main(String[] args) { 

     Test test = new Test(); 


     int i = 1; 
     if(i ==1){ 
      test.setService(new PrepaidPaymentService()); 
      test.service.processPayment(); 
     } 
     i = 2; 
     if(i == 2){ 
      test.setService(new PostPaidPaymentService()); 
      test.service.processPayment(); 
     } 


    } 


    public void setService(PaymentService service){ 
     this.service = service; 
    } 

} 
+0

決定實現類的條件是什麼? – shazinltc

回答

0

原因之一是通過自動裝配界面(即使有@Qualifier)你可以注入用於測試目的不同的實現。

例如,如果您有使用DAO訪問數據庫的服務,則可能需要替換該DAO以便對服務進行單元測試。通過除了什麼mthmulders說,下面的場景自動裝配上interfa

0

也適用 -

類型的自動裝配工作時,只有一個實現存在。如果你有多個實現,那麼Spring需要知道選擇哪一個。 @Qualifier允許您定義在這種情況下選擇哪一個。

+0

是的,這是我的觀點,我感到困惑。我必須通過我自己指定使用@Qualifier選擇哪個實現,然後重新編譯我的代碼。我應該怎麼做才能讓容器在運行時理解,如果它是'case 1'給我'ImplementationOne'的實例,否則給我'ImplementationTwo'的實例。 – Jawad

+0

在運行時將提供您對ImplementationOne或ImplementationTwo感興趣的信息? –