我正在经历Oracle Java EE 6 Tutorial并在“Beans as Injectable Objects”部分下面,它说
可以注入以下类型的对象:
(几乎)任何Java类
会话bean ......
什么是无法注入的Java类的示例?是否只是他们提到的一些理论技术限制,或者是否存在可以注入的类的已知限制?
答案 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,除非它是“正常作用域”并且至少有以下一个成立:
int
,double
等)或数组正常作用域(例如@Application-
,@Session-
,@RequestScoped
)表示它需要由容器代理,因此上述限制可能被“不可代理”替换。 @Dependent
和@javax.inject.Singleton
不是正常范围,它们是伪范围。