重庆高端网站seo,wordpress管理工具,钓鱼软件生成器,沈阳网站设计定制网站建设Qualifier
1. 解释
当Spring中存在多个类型相同但是名称不同的Bean时#xff0c;使用Autowired注解向类的构造方法、方法、参数、字段中注入Bean对象时#xff0c;首先会根据Bean的类型注入#xff0c;如果存在多个类型相同的Bean时#xff0c;会根据Bean的名称注入…Qualifier
1. 解释
当Spring中存在多个类型相同但是名称不同的Bean时使用Autowired注解向类的构造方法、方法、参数、字段中注入Bean对象时首先会根据Bean的类型注入如果存在多个类型相同的Bean时会根据Bean的名称注入如果找不到对应名称的Bean时就会抛出异常。
对于上述场景可以通过Qualifier注解明确指定要注入的Bean
2. 场景
当项目中集成了多个消息中间件对外提供同意发送消息的接口基于RocketMQ、Kafka、RabbitMQ实现的消息发送类上分别标注了不同的Bean名称。如果在业务系统中需要指定使用某种消息中间件来发送消息时就需要使用Qualifier注解来明确指定Bean的名称
3. 源码
Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.CONSTRUCTOR})
Retention(RetentionPolicy.RUNTIME)
Documented
Qualifier
public interface Qualifier {// 表示Bean的唯一标识// 当使用Spring按照类型自动注入式存在多个类型相同的Bean的时候就可以使用此注解来明确注入哪个Bean对象String value() default ;
}
4. Demo
4.1 区分同名Bean
一个接口和两个实现不同名字的实现类
public interface PaymentService {void pay();
}Service(creditCardService)
public class CreditCardPaymentService implements PaymentService {public void pay() {System.out.println(Paying via Credit Card);}
}Service(paypalService)
public class PaypalPaymentService implements PaymentService {public void pay() {System.out.println(Paying via Paypal);}
}
使用Qualifier注解注入想要的Bean
Component
public class PaymentClient {private final PaymentService paymentService;Autowiredpublic PaymentClient(Qualifier(creditCardService) PaymentService paymentService) {this.paymentService paymentService;}public void performPayment() {paymentService.pay();}
}
4.2 使用在不同的位置
在字段注入中使用
Component
public class ServiceB {private final ServiceA serviceA;Autowiredpublic ServiceB(Qualifier(serviceA1) ServiceA serviceA) {this.serviceA serviceA;}
}
在Setter方法注入中使用
Component
public class ServiceB {private ServiceA serviceA;Autowiredpublic void setServiceA(Qualifier(serviceA1) ServiceA serviceA) {this.serviceA serviceA;}
}
在构造方法中使用
Component
public class ServiceC {private final ServiceA serviceA;private final ServiceB serviceB;Autowiredpublic ServiceC(Qualifier(serviceA1) ServiceA serviceA, ServiceB serviceB) {this.serviceA serviceA;this.serviceB serviceB;}
}