【问题标题】:CDI. Using @SpecializesCDI。使用@Specializes
【发布时间】:2015-07-29 15:16:12
【问题描述】:

我有一个关于使用@Specialization 的问题。按照 Java EE 6 或 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 文件中声明为替代方案。 ' 我不明白我应该怎么做才能使其按照教程中的规定工作?我是否需要添加注释@Alternative 并将此类添加到beans.xml?或者我是否需要将我的 bean 添加到 beans.xml

【问题讨论】:

    标签: java cdi


    【解决方案1】:

    回答你的问题

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

    是的

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

    没有。以上就可以了

    为您提供更多背景信息:

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

    @Alternative bean 用于替换时,@Specializes 会派上用场

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

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

    1. 创建一个您想使用的@Alternative bean(我们称之为 AltBean) 作为BeanA的替代品
    2. 在 beans.xml 中列出 AltBean 作为替代项

    案例 2:您有一个带有一个或多个限定符的 bean/实现(在您的案例 A 中)。在这种情况下,您必须

    1. 创建一个@Alternative @Specializes bean (SpecA) 您想用作 A 的替代品
    2. 使SpecA 扩展A
    3. 在 beans.xml 中列出 SpecA 作为替代项

    你的是案例 2。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-23
      • 1970-01-01
      • 2017-06-13
      • 1970-01-01
      • 2013-11-02
      • 2015-02-14
      相关资源
      最近更新 更多