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

sen*_*iwu 6 java cdi jakarta-ee

我正在阅读Oracle Java EE 6 教程和“Beans as Injectable Objects”部分下,它说

可以注入以下类型的对象:

(几乎)任何 Java 类

会话豆......

无法注入的 Java 类的示例是什么?这只是他们提到的一些理论上的技术限制,还是可以注入的类有已知的限制?

Nik*_*los 6

从规范,ch。2.2.1:

几乎任何 Java 类型都可能是 bean 的 bean 类型:

  • bean 类型可以是接口、具体类或抽象类,并且可以声明为 final 或具有 final 方法。
  • bean 类型可以是具有实际类型参数和类型变量的参数化类型。
  • bean 类型可以是数组类型。仅当元素类型相同时,才认为两种数组类型相同。
  • bean 类型可以是原始类型。原始类型被认为与它们在 java.lang 中对应的包装器类型相同。
  • bean 类型可以是原始类型。

类型变量不是合法的 bean 类型。包含通配符类型参数的参数化类型不是合法的 bean 类型。

请注意,第 5.4.1 节“不可代理的 bean 类型”中为具有正常作用域的 bean 指定了某些附加限制,如第 6.3 节“正常作用域和伪作用域”中所定义。

然后是参考部分:

容器不能代理某些合法的 bean 类型:

  • 没有没有参数的非私有构造函数的类,
  • 声明为 final 或具有 final 方法的类,
  • 原始类型,
  • 和数组类型。

总结一下:任何 Java 类型(包括接口、抽象类)都可以是 CDI bean,除非它是“正常范围”并且至少满足以下一项:

  • 没有没有参数的非私有构造函数
  • 是最终的/有最终的方法
  • 是原语(int,double等)或阵列

Normal-scoped (eg @Application-, @Session-, @RequestScoped) 意味着它需要被容器代理,因此上述限制可能被“不可代理”代替。@Dependent并且@javax.inject.Singleton是不正常的范围,他们是伪范围。