Java EE中的CDI - 哪些Java类无法注入?

时间:2014-01-22 10:21:56

标签: java java-ee cdi

我正在经历Oracle Java EE 6 Tutorial并在“Beans as Injectable Objects”部分下面,它说

  

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

     

(几乎)任何Java类

     

会话bean   ......

什么是无法注入的Java类的示例?是否只是他们提到的一些理论技术限制,或者是否存在可以注入的类的已知限制?

1 个答案:

答案 0 :(得分:4)

来自spec,ch。 2.2.1:

  

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

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

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

     

请注意,对于具有正常范围的bean,第5.4.1节“不可提供的bean类型”中指定了某些其他限制,如第6.3节“正常范围和伪范围”中所定义。

然后引用的部分:

  

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

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

总而言之:任何Java类型(包括接口,抽象类)都可以是CDI bean,除非它是“正常作用域”并且至少有以下一个成立:

  • 没有没有参数的非私有构造函数
  • 是最终/有最终方法
  • 是原始的(intdouble等)或数组

正常作用域(例如@Application-@Session-@RequestScoped)表示它需要由容器代理,因此上述限制可能被“不可代理”替换。 @Dependent@javax.inject.Singleton 不是正常范围,它们是伪范围。