2013-04-18 1 views
2

Этот вопрос уже задан здесь по следующей ссылке.Весна Зависимость впрыска с использованием интерфейса с более чем одной реализацией

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

То, что я хочу знать, если мы используем @Qualifier впрыснуть боб, чем то, что является целью автоматического связывания интерфейса ?? Почему бы нам не автоподключить один и тот же класс реализации?

Путем автосогласования интерфейса мы хотим использовать полиморфизм во время выполнения, но это не достигается, если мы будем следовать подходу @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, чтобы выполнить тестирование службы. По автоматического связывания на interfa

0

Помимо того, что сказал mthmulders следующий сценарий также применим -

автоматического связывания по типу работ, когда только одна реализация присутствует. Если у вас есть несколько реализаций, Spring необходимо знать, какой из них выбрать. @Qualifier позволяет определить, какой из них выбрать в этом сценарии.

+0

Да, это моя точка, когда я смущаюсь. Я должен указать по своему усмотрению, какую реализацию выбрать с помощью @Qualifier, а затем перекомпилировать мой код. что я должен сделать, чтобы контейнер понял во время выполнения, что если это «случай 1», дайте мне экземпляр «ImplementationOne», дайте мне экземпляр «ImplementationTwo». – Jawad

+0

Во время выполнения, с которого будет предоставлена ​​информация, которую вы заинтересованы в реализацииOne или ImplementationTwo? –

Смежные вопросы