CDI。使用@Specializes

时间:2015-07-29 15:16:13

标签: java cdi

我对使用@Specialization有疑问。正如Java EE 6或7教程所规定的那样,如果我通过给它@Specializes注释来声明我的bean,那就是它。 ll完全替换bean,它扩展了我的bean。 E.g。

    public interface I {}
    @Default @Q
    public class A implements I {}
    @Specializes
    public class SpecA extends A {}
    ////
    a) @Inject I a;
    b) @Inject @Q I b;

是否足以将SpecA注入到字段' a'和' b'? 我试图在glassfish 4.0上运行这个例子但它没有用。

我在教程中读过奇怪的句子: '通常,标有@Specializes注释的bean也是一种替代方法,并在beans.xml文件中声明为替代方法。 ' 我不明白我该怎么做让它按照教程中的规定工作?我是否需要添加注释@Alternative并将此类添加到beans.xml?或者我需要将我的bean添加到beans.xml吗?

1 个答案:

答案 0 :(得分:3)

回答你的问题

  

我是否需要添加注释@Alternative并将此类添加到beans.xml?

  

我是否需要将bean添加到beans.xml?

没有。上面会做

为您提供更多背景信息:

@Specializes或多或少意味着专门化@Alternative bean。

@Specializes bean要替换

时,

@Alternative会派上用场

  • 使用一个或多个限定符注释的bean /实现 和
  • 注入点使用一个或多个限定符。

案例1:您有一个没有限定符的bean /实现(让我们调用BeanA)。在这种情况下,您不需要@Specializes,您必须

  1. 创建一个要使用的@Alternative bean(让我们调用AltBean) 作为BeanA的替代
  2. 在beans.xml中列出AltBean作为替代
  3. 案例2:您有一个bean /实现(在您的情况下为A),带有一个或多个限定符。在这种情况下,您必须

    1. 创建@Alternative @Specializes bean(SpecA) 您想用它作为A
    2. 的替代品
    3. SpecA延长A
    4. 在beans.xml中列出SpecA作为替代
    5. 你的是案例2。