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