Java EE CDI bean范围
Java EE平臺(tái)的上下文和依賴注入(CDI)是一項(xiàng)功能,可幫助將Java EE平臺(tái)的Web層和事務(wù)層綁定在一起。 CDI是一組服務(wù),可以一起使用,使開發(fā)人員可以輕松地在Web應(yīng)用程序中使用企業(yè)bean和JavaServer Faces技術(shù)。
在CDI中,bean是定義應(yīng)用程序狀態(tài)和/或邏輯的上下文對(duì)象的源。 如果容器可以根據(jù)CDI規(guī)范中定義的生命周期上下文模型來管理其實(shí)例的生命周期,則Java EE組件就是Bean。
托管bean由Java類(稱為其bean類)實(shí)現(xiàn)。 如果任何其他Java EE技術(shù)規(guī)范(例如JavaServer Faces技術(shù)規(guī)范)將頂級(jí)Java類定義為托管bean,則該頂級(jí)Java類為托管bean。
當(dāng)我們需要使用在Web應(yīng)用程序中注入另一個(gè)bean類的bean時(shí),該bean需要能夠在用戶與應(yīng)用程序交互期間保持狀態(tài)。 定義此狀態(tài)的方法是給Bean一個(gè)范圍。 范圍為對(duì)象提供了明確定義的生命周期上下文。 有作用域的對(duì)象可以在需要時(shí)自動(dòng)創(chuàng)建,并在創(chuàng)建對(duì)象的上下文結(jié)束時(shí)自動(dòng)銷毀。 而且,其狀態(tài)將由在相同上下文中執(zhí)行的所有客戶端自動(dòng)共享。
當(dāng)我們創(chuàng)建一個(gè)作為托管bean的Java EE組件時(shí),它將成為一個(gè)有范圍的對(duì)象,該對(duì)象存在于定義良好的生命周期上下文中。 下表提供了CDI提供的范圍:
1.請(qǐng)求– @RequestScoped
該范圍描述了單個(gè)HTTP請(qǐng)求中用戶與Web應(yīng)用程序的交互。 @RequestScoped注釋的bean的實(shí)例具有HTTP請(qǐng)求生命周期。
2.會(huì)話– @SessionScoped
此作用域表示跨多個(gè)HTTP請(qǐng)求的用戶與Web應(yīng)用程序的交互。
3.應(yīng)用程序– @ApplicationScoped
在這種情況下,狀態(tài)在所有用戶與Web應(yīng)用程序的交互中共享。 容器為所有客戶端請(qǐng)求提供了@ApplicationScoped注釋的Bean的相同實(shí)例。
4.對(duì)話– @ConversationScoped
此范圍描述了用戶與JavaServer Faces應(yīng)用程序之間的交互作用,該交互作用在顯式的開發(fā)人員控制的邊界內(nèi),該邊界將范圍擴(kuò)展到JavaServer Faces生命周期的多次調(diào)用。 所有長(zhǎng)時(shí)間運(yùn)行的對(duì)話都限于特定的HTTP Servlet會(huì)話,并且可能不會(huì)跨越會(huì)話邊界。
注意,使用ConversationScoped Bean,我們可以從ViewScoped JSF Bean中獲得所需的功能。 此外,借助ConversationScoped Bean,我們可以在不同的頁(yè)面請(qǐng)求之間維護(hù)相同的對(duì)話(或狀態(tài))。 但是,當(dāng)我們不進(jìn)行對(duì)話時(shí),托管Bean將保持活動(dòng)狀態(tài)直到超時(shí)。
需要注意的是,使用會(huì)話或會(huì)話范圍的bean必須可序列化。 這是因?yàn)槿萜鲿?huì)不時(shí)地鈍化HTTP會(huì)話,因此當(dāng)再次激活該會(huì)話時(shí),必須檢索Bean的狀態(tài)。
5. Singleton – @Singleton偽作用域
這是一個(gè)偽作用域。 它定義了一次實(shí)例化bean。 當(dāng)將CDI托管bean注入另一個(gè)bean中時(shí),CDI容器將使用代理。 代理是處理對(duì)bean的調(diào)用的代理。 但是,@ @Singleton注釋的bean沒有代理對(duì)象。 客戶端直接引用單例實(shí)例。 那么,當(dāng)客戶端被序列化時(shí)會(huì)發(fā)生什么? 我們必須確保單例bean保持單例。 為此,有幾種方法,例如,讓單例bean實(shí)現(xiàn)writeResolve()和readReplace() (由Java序列化規(guī)范定義),確??蛻舳藘H保留對(duì)單例bean的臨時(shí)引用,或者給出客戶端對(duì)Instance<X>類型的引用,其中X是單例bean的bean類型。
6. Dependent – @Dependent偽作用域
該偽作用域意味著存在一個(gè)對(duì)象,該對(duì)象恰好服務(wù)于一個(gè)客戶端(bean),并且具有與該客戶端(bean)相同的生命周期。 這是未顯式聲??明作用域類型的bean的默認(rèn)作用域。 從屬bean的實(shí)例永遠(yuǎn)不會(huì)在不同客戶端或不同注入點(diǎn)之間共享。 嚴(yán)格來說,它是某些其他對(duì)象的從屬對(duì)象。 當(dāng)創(chuàng)建它所屬的對(duì)象時(shí),將實(shí)例化該對(duì)象,并在刪除它所屬的對(duì)象時(shí)將其銷毀。
除@Dependent外,所有預(yù)定義范圍都是上下文范圍。 CDI將上下文范圍的bean放入其生命周期由Java EE規(guī)范定義的上下文中。 例如,會(huì)話上下文及其bean在HTTP會(huì)話的生存期內(nèi)存在。 對(duì)bean的注入引用是上下文相關(guān)的。 引用始終應(yīng)用于與進(jìn)行引用的線程的上下文相關(guān)聯(lián)的Bean。 CDI容器確保根據(jù)為這些對(duì)象指定的范圍所確定的正確時(shí)間創(chuàng)建和注入對(duì)象。
您還可以定義和實(shí)現(xiàn)自定義范圍。 實(shí)施和擴(kuò)展CDI規(guī)范的人員可以使用它們。 這是CDI提供的所有bean范圍的教程。 參考文獻(xiàn):
- Seam框架參考文檔
- Java EE 6教程
翻譯自: https://www.javacodegeeks.com/2013/04/java-ee-cdi-bean-scopes.html
總結(jié)
以上是生活随笔為你收集整理的Java EE CDI bean范围的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑主板电池放电的方法电脑主板如何放电
- 下一篇: Java SE 7 Update 25