【问题标题】:Is the @Dependent CDI annotation inherited by subclasses?@Dependent CDI 注解是否被子类继承?
【发布时间】:2016-06-17 09:36:08
【问题描述】:

我有这些课程:

@Dependent
public abstract class ClassA{...}

public class ClassB extends ClassA{...}

public class ClassC{
  @Inject
  private ClassB classB;
}

那么,classC 实例中注入的classB 实例会在classC 实例被销毁时被销毁吗?换句话说就是 @Dependent子类继承的CDI注解?

【问题讨论】:

    标签: java jakarta-ee dependency-injection cdi


    【解决方案1】:

    这是CDI 1.0 spec 中的相关部分。注意第二个要点:

    假设一个类 X 被 bean 类直接或间接扩展 托管 bean 或会话 bean Y。

    • 如果 X 使用限定符类型、构造型或拦截器绑定类型 Z 进行注释,则 Y 继承该注释当且仅当 Z 声明 @Inherited 元注释,既不是 Y 也不是任何 作为 X 的子类和 Y 的超类的中间类 声明一个 Z 类型的注解。
      (此行为由 Java 语言规范定义。)

    • 如果 X 使用范围类型 Z 进行注释,则 Y 继承该注释当且仅当 Z 声明了 @Inherited 元注释 既不是 Y 也不是任何作为 X 的子类的中间类和 Y 的超类声明了一个作用域类型。
      (此行为与 Java 语言中定义的行为不同 规范。)

    由 X 显式声明并由 Y 从 X 继承的作用域类型 优先于声明或继承的构造型的默认范围 是的。

    由于@Dependent 伪范围确实具有@Inherited 元注释,如果子类或任何中间类都没有范围注释(如您的示例),则范围被继承。

    由于@Dependent 范围是默认范围,我认为这两种方式都没有太大关系。

    【讨论】:

    • 那么,我是否理解正确 - 如果我希望 ClassB 实例在 ClassC 实例被销毁时也被销毁,我必须这样做 @Inherited public class ClassB extends ClassA{...}
    • 没有。 @Inherited@Dependent 注释类型的元注释。你不必做任何事情。即使没有 @Dependent 注释本身(因为它是默认范围),您的代码也会按照您的预期运行。
    猜你喜欢
    • 1970-01-01
    • 2012-05-22
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    • 1970-01-01
    • 2014-01-01
    相关资源
    最近更新 更多