Java EE CDI依赖注入(@Inject)教程
在本教程中,我們將向您展示如何在CDI管理的Bean中實現依賴注入。 特別是,我們將利用CDI API提供的@Inject批注將CDI bean注入另一個bean。 這樣,可以在應用程序(例如JavaServer Faces應用程序)中使用bean。
CDI提供了幾種將Bean注入應用程序的方法。 我們可以使用字段依賴注入,構造函數依賴注入或通過setter方法的依賴注入來注入CDI bean。 我們還可以注入生產者方法的參數,但這超出了本教程的范圍。 讓我們檢查一下CDI提供的所有注入方式:
1.字段依賴注入
注入CDI bean的最簡單方法是在要注入的屬性中添加@Inject批注。 讓我們看下面的例子。 GreetingBean有一個@Inject注釋字段,它是helloBean 。 這樣,另一個bean HelloBean被注入GreetingBean 。
package com.javacodegeeks.snippets.enterprise.cdibeans;import javax.inject.Inject;public class GreetingBean {@Inject private HelloBean helloBean;}2.構造函數依賴注入
初始化CDI bean時,容器將使用其默認構造函數。 如果有另一個帶有@Inject注釋的構造函數,則容器將自動使用該構造函數,這樣,構造函數中傳遞的參數將被注入Bean中。 這里要注意的是,我們只能有一個構造函數注入點。 如果我們創建另一個@Inject注釋的構造函數,則容器的行為是不可預測的。
在GreetingBean下方的代碼段中,有一個構造函數,該構造函數帶有@Inject注釋和一個參數,即另一個bean HelloBean 。 以這種方式實現注射。
package com.javacodegeeks.snippets.enterprise.cdibeans;import javax.inject.Inject;public class GreetingBean {private final HelloBean helloBean;@Injectpublic GreetingBean(HelloBean helloBean){this.helloBean = helloBean;}}3.通過setter方法進行依賴注入
在下面的示例中,使用@Inject注釋對setHelloBean(HelloBean helloBean)方法進行注釋。 因此,當GreetingBean由容器初始化時,將調用該方法,因為該方法帶有@Inject注釋,并且將注入HelloBean 。
package com.javacodegeeks.snippets.enterprise.cdibeans;import javax.inject.Inject;public class GreetingBean {private HelloBean helloBean;@Injectpublic void setHelloBean(HelloBean helloBean) {this.helloBean = helloBean;} }4.使用@Any限定詞
當我們對一個接口有多種實現,并且希望將它們全部注入到另一個bean中時,可以使用@Any限定符。 使用此注釋,容器將注入指定接口的所有實現。 它與CDI API提供的javax.enterprise.inject.Instance接口一起使用,如下面的代碼片段所示:
package com.javacodegeeks.snippets.enterprise.cdibeans;import javax.enterprise.inject.Any; import javax.enterprise.inject.Instance; import javax.inject.Inject;public class GreetingBean {@Injectpublic void getAllBeanImplementations(@Any Instance<HelloBean> beans) {for (HelloBean helloBean : beans) {System.out.println(helloBean.getClass().getCanonicalName());}} }在這里我們必須注意,如果有多個依賴關系滿足一個注入點,并且我們將不使用@Any限定符,而是嘗試注入一個,那么容器將失敗。
5.使用代理進行注射
為了將托管bean注入到另一個bean中(除@Dependent注釋的bean之外),CDI容器不會傳遞對注入的bean本身的引用,而是傳遞給代理的引用。 代理透明地處理對注入的bean的所有調用。 例如,當我們將SessionScoped bean注入ApplicationScoped bean并且許多客戶端訪問ApplicationScopedBean ,代理將被用來處理對注入的bean的調用。 每個代理都可以將調用重定向到正確的bean。
最后,請注意,通過擴展Bean類并覆蓋所有非自變方法來創建CDI代理。 原始類型不能被注入。 Bean類必須具有非私有的默認構造函數,并且不能為final,也不能具有final方法。
這是使用@Inject批注的CDI托管Bean中的依賴注入的教程。
翻譯自: https://www.javacodegeeks.com/2013/05/java-ee-cdi-dependency-injection-inject-tutorial.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Java EE CDI依赖注入(@Inject)教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 云闪付转账怎么每次都要验证码?
- 下一篇: Heroku和Java –从新手到初学者