0

我没有经验,EJB目前CDI我正在尝试理解它们的一些基本原理以及如何使用它。我特别想掌握它的用途和用途,Qualifiers并且我已经阅读了指南。但是,我无法完全理解 a 如何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并且我收到一个异常,那么我推断它(多个实现)只能通过替代实现。我对吗?

4

1 回答 1

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 匹配,你会得到明确的依赖关系。

于 2013-08-17T12:13:55.263 回答