我在EJB
和CDI
方面没有经验,我目前正在尝试理解它们的一些基本原理以及如何使用它。特别是我想了解Qualifiers
的目的和用法,我已经阅读了guide。我无法完全理解,Qualifier
如何作为接口的扩展。引用指南和语句中的示例:“限定符就像接口的扩展。它不会创建对任何特定实现的直接依赖。可能有多个@Asynchronous PaymentProcessor的替代实现! “,我认为可以做到:
@Asynchronous
public class AsynchronousPaymentProcessor implements PaymentProcessor {
public void process(Payment payment) { ... }
}
和
@Asynchronous
public class OtherAsynchronousPaymentProcessor implements PaymentProcessor {
public void process(Payment payment) { ... }
}
然后他们尝试注入:
@Inject @Asynchronous PaymentProcessor asyncPaymentProcessor;
在这种情况下如何确定注入哪个bean,因为两者都使用相同的Qualifier
进行注释?或者,限定符的多个实现只涉及Alternatives
?
更新完成:
我也阅读了相关问题。我想要的是一个答案,没有很长的描述:因为我可以注入实现接口的类型类,注入接口类型的好处是什么,其他实现松散耦合?如果我尝试使用2 @Asynchronous
实现的上述代码并且我收到一个异常,那么我推断它(多个实现)只能通过替代方案实现。我是对的吗?
答案 0 :(得分:0)
根据规范,第5.2节:
如果符合以下情况,bean可分配给给定的注入点:
bean具有与所需类型匹配的bean类型。为此,基本类型被认为与java.lang中相应的包装类型相匹配,并且只有在元素类型相同时才认为数组类型匹配。如果参数化和原始类型相同或者bean类型可分配给所需类型,则认为参数化和原始类型匹配,如第5.2.3节“原始类型和参数化类型的可分配性”或第8.3.1节“原始的可分配性”中所定义和委托注入点的参数化类型“。
bean具有所有必需的限定符。如果未明确指定必需的限定符,则容器将采用所需的限定符@Default。如果bean具有(a)相同类型的限定符,并且(b)每个未注释的成员的注释成员值@javax.enterprise.util.Nonbinding,则bean具有必需的限定符。
简而言之,容器查找满足注入点类型的所有bean,然后注入一个bean,其一组限定符与注入点上的限定符集匹配。如果没有bean匹配,则会得到不满意的依赖项,或者如果多个bean匹配,则会得到明确的依赖。