Spring Dependency注入使用具有多个实现的接口

时间:2013-04-18 07:49:17

标签: java spring java-ee autowired

我的问题已在以下链接中提出。

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

如果我们使用@Qualifier注入bean而不是自动装配接口的目的,我想知道什么?为什么我们不自动连接相同的实现类??

通过自动装配接口,我们希望利用运行时多态性,但如果我们遵循@Qualifier的方法,则无法实现。请建议我采用标准方式。

如果我没有弹簧,那么下面是简单的代码。我想知道spring会如何注入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;
    }

}

2 个答案:

答案 0 :(得分:0)

一个原因是通过自动装配接口(即使使用@Qualifier),您可以为测试目的注入不同的实现。

例如,如果您有使用DAO访问数据库的服务,则可能需要替换该DAO以对服务进行单元测试。通过在interfa上自动装配

答案 1 :(得分:0)

除了mthmulders所说的以下场景也适用 -

当只有一个实现存在时,按类型自动装配工作。如果你有多个实现,那么Spring需要知道要选择哪一个。 @Qualifier允许您定义在此场景中选择哪一个。