java ee cdi_Java EE CDI依赖注入(@Inject)教程
java ee cdi
在本教程中,我們將向您展示如何在CDI管理的Bean中實現(xiàn)依賴注入。 特別是,我們將利用CDI API提供的@Inject批注將CDI bean注入另一個bean。 通過這種方式,可以在應(yīng)用程序(例如JavaServer Faces應(yīng)用程序)中使用bean。
CDI提供了幾種將Bean注入應(yīng)用程序的方法。 我們可以使用字段依賴注入,構(gòu)造函數(shù)依賴注入或通過setter方法的依賴注入來注入CDI bean。 我們也可以注入生產(chǎn)者方法的參數(shù),但這超出了本教程的范圍。 讓我們檢查一下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.構(gòu)造函數(shù)依賴注入
初始化CDI bean時,容器將使用其默認構(gòu)造函數(shù)。 當有另一個帶有@Inject注釋的構(gòu)造函數(shù)時,容器將自動使用該構(gòu)造函數(shù),這樣,構(gòu)造函數(shù)中傳遞的參數(shù)將被注入Bean中。 這里要注意的是,我們只能有一個構(gòu)造函數(shù)注入點。 如果我們創(chuàng)建另一個@Inject注釋的構(gòu)造函數(shù),則容器的行為是不可預(yù)測的。
在GreetingBean下面的代碼段中,有一個構(gòu)造函數(shù),該構(gòu)造函數(shù)帶有@Inject注釋和一個參數(shù),即另一個bean HelloBean 。 以這種方式實現(xiàn)注射。
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由容器初始化時,將調(diào)用該方法,因為該方法帶有@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限定詞
當我們有一個接口的多個實現(xiàn),并且想要將它們?nèi)孔⑷肓硪粋€bean中時,可以使用@Any限定符。 使用此注釋,容器將注入指定接口的所有實現(xiàn)。 它與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());}} }在這里,我們必須注意,如果有多個滿足注入點的依賴關(guān)系,并且我們將不使用@Any限定符,而是嘗試注入一個,那么容器將失敗。
5.使用代理進行注射
為了將托管bean注入另一個bean中(除@Dependent注釋的bean之外),CDI容器不會傳遞對注入的bean本身的引用,而是傳遞給代理的引用。 代理透明地處理對注入的Bean的所有調(diào)用。 例如,當我們將SessionScoped bean注入ApplicationScoped bean并且許多客戶端訪問ApplicationScopedBean ,代理將用于處理對注入的bean的調(diào)用。 每個代理都可以將調(diào)用重定向到正確的bean。
最后,請注意,通過擴展Bean類并覆蓋所有非自變方法來創(chuàng)建CDI代理。 原始類型不能被注入。 Bean類必須具有非私有的默認構(gòu)造函數(shù),并且不能為final,也不能具有final方法。
這是使用@Inject批注的CDI托管Bean中的依賴注入的教程。
翻譯自: https://www.javacodegeeks.com/2013/05/java-ee-cdi-dependency-injection-inject-tutorial.html
java ee cdi
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的java ee cdi_Java EE CDI依赖注入(@Inject)教程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 事宜愿为是什么意思 事宜愿为解释
- 下一篇: Java 8中的可重复注释