Java EE CDI依赖注入(@Inject)教程
在本教程中,我們將向您展示如何在CDI管理的Bean中實(shí)現(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時,容器將使用其默認(rèn)構(gòu)造函數(shù)。 如果有另一個帶有@Inject注釋的構(gòu)造函數(shù),則容器將自動使用該構(gòu)造函數(shù),這樣,構(gòu)造函數(shù)中傳遞的參數(shù)將被注入Bean中。 這里要注意的是,我們只能有一個構(gòu)造函數(shù)注入點(diǎn)。 如果我們創(chuàng)建另一個@Inject注釋的構(gòu)造函數(shù),則容器的行為是不可預(yù)測的。
在GreetingBean下方的代碼段中,有一個構(gòu)造函數(shù),該構(gòu)造函數(shù)帶有@Inject注釋和一個參數(shù),即另一個bean HelloBean 。 以這種方式實(shí)現(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方法進(jìn)行依賴注入
在下面的示例中,使用@Inject注釋對setHelloBean(HelloBean helloBean)方法進(jìn)行注釋。 因此,當(dāng)GreetingBean由容器初始化時,將調(diào)用該方法,因?yàn)樵摲椒◣в?#64;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限定詞
當(dāng)我們對一個接口有多種實(shí)現(xiàn),并且希望將它們?nèi)孔⑷氲搅硪粋€bean中時,可以使用@Any限定符。 使用此注釋,容器將注入指定接口的所有實(shí)現(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)系滿足一個注入點(diǎn),并且我們將不使用@Any限定符,而是嘗試注入一個,那么容器將失敗。
5.使用代理進(jìn)行注射
為了將托管bean注入到另一個bean中(除@Dependent注釋的bean之外),CDI容器不會傳遞對注入的bean本身的引用,而是傳遞給代理的引用。 代理透明地處理對注入的bean的所有調(diào)用。 例如,當(dāng)我們將SessionScoped bean注入ApplicationScoped bean并且許多客戶端訪問ApplicationScopedBean ,代理將被用來處理對注入的bean的調(diào)用。 每個代理都可以將調(diào)用重定向到正確的bean。
最后,請注意,通過擴(kuò)展Bean類并覆蓋所有非自變方法來創(chuàng)建CDI代理。 原始類型不能被注入。 Bean類必須具有非私有的默認(rèn)構(gòu)造函數(shù),并且不能為final,也不能具有final方法。
這是使用@Inject批注的CDI托管Bean中的依賴注入的教程。
翻譯自: https://www.javacodegeeks.com/2013/05/java-ee-cdi-dependency-injection-inject-tutorial.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的Java EE CDI依赖注入(@Inject)教程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 云闪付转账怎么每次都要验证码?
- 下一篇: 灰蓝色显白还是显黑(衬衫灰蓝色配什么颜色