我的问题已在以下链接中提出。
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;
}
}
答案 0 :(得分:0)
一个原因是通过自动装配接口(即使使用@Qualifier
),您可以为测试目的注入不同的实现。
例如,如果您有使用DAO访问数据库的服务,则可能需要替换该DAO以对服务进行单元测试。通过在interfa上自动装配
答案 1 :(得分:0)
除了mthmulders所说的以下场景也适用 -
当只有一个实现存在时,按类型自动装配工作。如果你有多个实现,那么Spring需要知道要选择哪一个。 @Qualifier允许您定义在此场景中选择哪一个。