Java CDI。使用@Specializes

Java CDI。使用@Specializes,java,cdi,Java,Cdi,我有一个关于使用@Specialization的问题。按照JavaEE6或7教程的规定,如果我通过给@Specializes注释来声明我的bean,它将完全替换bean,从而扩展我的bean。例如 public interface I {} @Default @Q public class A implements I {} @Specializes public class SpecA extends A {} //// a) @Inje

我有一个关于使用@Specialization的问题。按照JavaEE6或7教程的规定,如果我通过给@Specializes注释来声明我的bean,它将完全替换bean,从而扩展我的bean。例如

    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文件中声明为备选方案。'
我不明白我该怎么做才能让它像教程中规定的那样工作?我需要添加annotation@Alternative并将该类添加到beans.xml吗?或者我需要将我的bean添加到beans.xml吗?

来回答您的问题

我需要添加注释
@Alternative
并将该类添加到beans.xml吗

我需要将bean添加到beans.xml吗

不,上面的就行了

给你更多的背景:

@specialized
或多或少意味着专门化一个
@可选的
bean

@替代
bean要替换时,
@专用
很方便

  • 用一个或多个限定符注释的bean/实现 及
  • 注入点使用一个或多个限定符
案例1:您有一个没有限定符的bean/实现(让我们调用
BeanA
)。在这种情况下,您不需要
@
,您必须

  • 创建一个您想要使用的
    @备选
    bean(我们称之为AltBean) 作为BeanA的替代品
  • 在beans.xml中列出
    AltBean
    ,作为备选方案
  • 案例2:您有一个bean/实现(在您的案例A中)和一个或多个限定符。在这种情况下,你必须

  • 创建一个
    @备选方案
    bean(
    SpecA
    ) 您希望用作替换的
  • 使
    SpecA
    extend
    A
  • 在beans.xml中列出
    SpecA
    ,作为备选方案
  • 你的是案例2