【问题标题】:Qualifier as extention of an interface限定符作为接口的扩展
【发布时间】:2013-08-17 09:54:30
【问题描述】:

我对@9​​87654323@ 和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 实现尝试上面的代码并且我收到一个异常,那么我推断它(多个实现)只能通过替代方案来实现。我说的对吗?

【问题讨论】:

  • 请看一下这个答案,尤其是标题为“是否需要限定符?”的部分stackoverflow.com/questions/15231255/…
  • 另外,您的示例未正确遵循指南,在这种情况下,您将收到 UnambiguousDependecyException。在指南中,他们有两个限定符,@Synchronous@Asynchronous
  • 或者对于他们在两个实现中使用@Asynchronous 的示例,他们添加了额外的限定符。

标签: jakarta-ee ejb cdi


【解决方案1】:

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

【讨论】:

  • 非常接近。在 CDI(实际上是 JSR 330)中,限定符和组合的对象类型是注入点的完整类型。限定符向注入点添加更多元类型信息。
  • @LightGuard 所以,你宁愿让我换种说法,容器只是将注入点的类型与 bean 的类型相匹配,因为为了注入目的,限定符补充了这两种类型,而不是说容器首先匹配类型,然后是限定符,或者是别的什么?
  • 容器以何种方式执行它更多的是实现细节。如果所有三个实现都以相同的方式进行这只是巧合,那么规范并没有强制要求以特定的方式进行。只需添加进一步的说明。
  • @LightGuard 你是对的。然而,我这样表述并不是因为它是如何实现的,而是要指出,尽管任何特定的 bean 都可以实现多个接口,但只有一个就足以匹配(我想这是显而易见的原因)而 all(所有限定符的集合)必须完全匹配。
猜你喜欢
  • 2010-09-12
  • 2012-11-06
  • 1970-01-01
  • 2015-08-09
  • 1970-01-01
  • 2021-12-07
  • 2020-09-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多