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

來源:互聯網
上載者:User

JavaEE中的依賴性——依賴性注入,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方法提供符合測試所需資源的實現。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.