JavaEE中的依賴性——依賴性注入

當一個資源註解防止在一個字段或setter方法之上時,將會發生兩件事。首先,就像放置在bean類之上一樣聲明資源引用(類似於上文中的代碼示例),而且當創建組件時將把資源名稱綁定到環境命名上下文。第二,該服務器將爲您自動進行依賴性查找,並把結果設置到實例化的類中。

自動超找一個資源並將它設置到類中的過程稱之爲依賴性注入(dependency injection)因爲據說服務器將把解析的依賴性注入類中。這種技術,其中一項通常稱作控制反轉(inversion of control),消除了手動從JNDI環境上下文中查找資源的負擔。依賴性注入被認爲是應用程序開發的最佳實踐,不僅是因爲它減少JNDI查找的需要(和相關的服務定位器模式),而且還因爲它簡化了測試。類中沒有任何的JNDI API代碼依賴於應用服務器運行時環境,因此,bean類可以在一個單元測試中直接實例化。開發人員可以手動提供所需的依賴性並測試試待檢查類的功能,而不用擔心如何圍繞JNDI API進行工作。

字段注入

第一種形式的依賴性注入稱之爲字段注入(field injection)。注入依賴性到字段意味着,服務器在環境命名上下文查找依賴之後,它直接把結果分配給類的註解字段。下面代碼重新審視了來自上面文章的代碼示例,並演示了@EJB註解,這次把結果注入audit字段。我們之前演示的所有目錄接口代碼中,bean的業務方法可以假設audit字段中保留了AuditService bean的引用。

(代碼)

字段注入當然最容易實現,本書的例子中使用這種形式完全是爲了節省空間。字段注入唯一需要考慮的是:如果您正在計劃單元測試,那麼您需要添加一個setter方法或使得這個字段是您的單元測試可訪問的,以手動滿足依賴性。儘管自由字段是合法的,但是如果沒有可訪問的方法,那麼將需要令人不快的黑客手段來設置它們的值。如果您希望單元測試不必添加一個setter方法,那麼請考慮字段注入的包(package)的範圍。

在上一節曾提到,當把一條資源註解放在一個字段或setter方法之上時,將引用自動生成的一個名稱,爲了完整起見,這裏將描述此名稱的格式,但是您不太可能有很多機會來使用它。生成的名稱完全限定爲類名,後跟一條正斜槓,然後是字段或屬性的名稱。這意味着如果AuditService bean位於persistence.session包中,那麼上面程序中引用的注入EJB在“persistence.session.AuditService/audit”名稱之下的環境命名上下文中將是可訪問的。對資源註解指定name元素將覆蓋此默認值。

setter注入

第二種形式的依賴性注入,稱爲setter注入(setterinjection),它涉及註解一個setter方法而不是類的字段。當服務器解析引用時,它將利用查詢的結果調用帶註解的setter方法。下面代碼最後一次審視了上面的代碼以演示setter注入的使用。

(代碼)

這種樣式的注入允許使用私有字段,但同樣也適用於單元測試。每個測試可以簡單地實例化bean類,並通過調用setter方法以手動執行該依賴性注入,通常會爲該setter方法提供符合測試所需資源的實現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章