Spring Dependency инжектиране с помощта на интерфейс с повече от една реализация

Въпросът ми вече беше зададен тук в следната връзка.

Spring: Защо да автоматично свързваме интерфейса, а не внедрения клас?

Какво искам да знам, ако използваме @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;
    }

}

person Jawad    schedule 18.04.2013    source източник
comment
Какво е условието, което определя класа на изпълнение?   -  person shazinltc    schedule 18.04.2013


Отговори (2)


Освен това, което каза mthmulders, следният сценарий също е приложим -

Автоматичното окабеляване по тип работи, когато е налице само едно изпълнение. Ако имате множество реализации, тогава Spring трябва да знае коя да избере. @Qualifier ви позволява да определите кой да изберете в този сценарий.

person Bhushan Bhangale    schedule 18.04.2013
comment
Да, това е моята точка, в която се обърквам. Трябва сам да посоча коя реализация да избера, като използвам @Qualifier и след това да компилирам отново своя код. какво трябва да направя, за да накарам контейнера да разбере по време на изпълнение, че ако е „случай 1“, дайте ми екземпляра „ImplementationOne“, иначе ми дайте екземпляра „ImplementationTwo“. - person Jawad; 18.04.2013
comment
По време на изпълнение откъде ще бъде предоставена информацията, че се интересувате от ImplementationOne или ImplementationTwo? - person Bhushan Bhangale; 18.04.2013

Една от причините е, че чрез автоматично свързване на интерфейса (дори с @Qualifier) можете да инжектирате различна реализация за целите на тестването.

Например, ако имате услуга, която използва DAO за достъп до база данни, може да искате да замените този DAO, за да тествате услугата с модул.

person mthmulders    schedule 18.04.2013
comment
Този отговор има отворен край като днешните филми ;-) - person STaefi; 15.02.2021