我正在經歷Oracle Java EE 6 Tutorial下節「Bean作爲注射對象」,它說Java EE中的CDI - 哪些Java類無法注入?
以下類型的對象可以注入:
(幾乎)任何Java類
會議beans ......
什麼是不能注入Java類的例子?這只是他們提到的一些理論技術限制,或者是否存在可注入類的已知限制?
我正在經歷Oracle Java EE 6 Tutorial下節「Bean作爲注射對象」,它說Java EE中的CDI - 哪些Java類無法注入?
以下類型的對象可以注入:
(幾乎)任何Java類
會議beans ......
什麼是不能注入Java類的例子?這只是他們提到的一些理論技術限制,或者是否存在可注入類的已知限制?
來自spec,ch。 2.2.1:
幾乎任何Java類型可以是bean類型中的bean:
- 一個bean類型可以是一個接口,一個具體的類或一個抽象類,並且可以被宣告最終或者有最終的方法。
- bean類型可能是一個帶有實際類型參數和類型變量的參數化類型。
- 一個bean類型可能是一個數組類型。僅當元素類型相同時,纔會將兩種數組類型視爲相同。
- 一個bean類型可能是一個原始類型。原始類型被認爲與java.lang中對應的包裝類型 相同。
- bean類型可能是原始類型。
類型變量不是合法的bean類型。包含通配符類型參數的參數化類型不是合法bean 類型。
請注意,在第6.3節「正常範圍和僞範圍」中定義的正常範圍的Bean的第5.4.1節「不可處理的bean類型」中指定了一些額外的限制。
然後所引用的部分:
某些法律豆類型不能由容器代理:
- 類不具有非私有構造不帶參數,
- 聲明爲final或具有最終方法的類
- 原始類型
- 和數組類型。
所以總結:任何Java類型(包括接口,抽象類)可以是CDI豆,除非它是「正常範圍的」和以下中的至少一個成立:
int
,double
等)或陣列正常範圍(例如, @Application-
, @Session-
,@RequestScoped
)表示它需要由容器代理,因此上述限制可能被「不可代理」代替。 @Dependent
和@javax.inject.Singleton
是而不是正常範圍,它們是僞範圍。
它可能不是你不能注入哪個類的問題,它更多的是你應該注入哪些類的問題。答案是由上下文決定的。例如,想要將EntityManager注入到JPA實體類中並不太聰明。 – Gimby