2014-01-22 46 views
3

我正在經歷Oracle Java EE 6 Tutorial下節「Bean作爲注射對象」,它說Java EE中的CDI - 哪些Java類無法注入?

以下類型的對象可以注入:

(幾乎)任何Java類

會議beans ......

什麼是不能注入Java類的例子?這只是他們提到的一些理論技術限制,或者是否存在可注入類的已知限制?

+1

它可能不是你不能注入哪個類的問題,它更多的是你應該注入哪些類的問題。答案是由上下文決定的。例如,想要將EntityManager注入到JPA實體類中並不太聰明。 – Gimby

回答

4

來自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豆,除非它是「正常範圍的」和以下中的至少一個成立:

  • 沒有與任何參數
  • 是最後一個非私有構造/有final的方法
  • 是primitiv e(int,double等)或陣列

正常範圍(例如, @Application-, @Session-,@RequestScoped)表示它需要由容器代理,因此上述限制可能被「不可代理」代替。 @Dependent@javax.inject.Singleton而不是正常範圍,它們是僞範圍。