限定符作为接口的扩展

时间:2013-08-17 09:54:30

标签: java-ee ejb cdi

我在EJBCDI方面没有经验,我目前正在尝试理解它们的一些基本原理以及如何使用它。特别是我想了解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实现的上述代码并且我收到一个异常,那么我推断它(多个实现)只能通过替代方案实现。我是对的吗?

1 个答案:

答案 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匹配,则会得到明确的依赖。