Java EE中的CDI - 不能注入哪些Java类?

6
我正在阅读Oracle Java EE 6 Tutorial,在“可注入对象的Bean”一节中,它说:
以下类型的对象可以被注入: 几乎所有的Java类 会话bean ......
有哪些Java类不能被注入的示例?他们只是提到了一些理论上的技术限制,还是已知有某些类型的类无法被注入?

1
可能并不是哪些类不能注入的问题,更多的是哪些类不应该被注入的问题。而这个答案取决于上下文。例如,想要将EntityManager注入到JPA实体类中并不是一个明智的选择。 - Gimby
1个回答

6
规范 第2.2.1章节中可以得知:
  • 几乎任何 Java 类型都可以是 Bean 类型:
    • Bean 类型可以是接口、具体类或抽象类,并且可以声明为 final 或具有 final 方法。
    • Bean 类型可以是具有实际类型参数和类型参数的参数化类型。
    • Bean 类型可以是数组类型。只有元素类型相同时,两个数组类型才被认为是相同的。
    • Bean 类型可以是原始类型。在 java.lang 中,原始类型被认为与其对应的包装器类型相同。
    • Bean 类型可以是原始类型(即 int、double 等)或数组类型。
    • Bean 类型可以是裸类型。
  • 类型变量不是合法的 Bean 类型。包含通配符类型参数的参数化类型不是合法的 Bean 类型。
  • 需要注意的是,通常作用域(如 @ApplicationScoped、@SessionScoped 或 @RequestScoped 等)的 Bean 需要由容器代理。因此,上述限制可以替换为“不可代理”。而 @Dependent 和 @javax.inject.Singleton 不是通常的作用域,它们是伪作用域。

    接下来引用的章节:

    容器无法代理某些合法的 Bean 类型:

    • 没有非私有、无参数构造函数的类
    • 被声明为 final 或具有 final 方法的类
    • 原始类型
    • 和数组类型
总之,任何 Java 类型(包括接口、抽象类)都可以是 CDI Bean,前提是它不是“正常作用域”,并且满足以下条件之一:
  • 没有非私有、无参数构造函数
  • 被声明为 final 或具有 final 方法
  • 是原始类型(如 int、double 等)或数组类型

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接