簡體   English   中英

JAVA EE CDI范圍,EJB和托管Bean序列化

[英]JAVA EE CDI Scopes, EJBs and managed beans serialization

對范圍,ejb和托管bean有一些疑問。

  1. 范圍(javax.enterprise.context.ApplicationScope,javax.enterprise.context.SessionScope)僅適用於EJB嗎? 還是它們適用於所有托管bean? 直到今天,我仍然確信它適用於所有托管bean。
  2. 在我的應用程序中,我們有:

     @ApplicationScoped public class MyClass implements MyNonSerializableInterface { @Inject private transient NonSerializableLogger transientLogger; @Inject private NonSerializableLogger logger; ... } 

    和一些經理:

     @Singleton public class SomeManager { @Inject private MyClass myClass; } 

    和網絡服務:

     @Path("some") public class SomeWebService { @Inject private SomeManager; } 

容器(部署時間)或編譯器沒有抱怨,這正常嗎?

我認為:

“使用會話,應用程序或會話范圍的Bean必須可序列化,但是使用請求范圍的Bean不必是可序列化的。” JAVA EE使用范圍

MyClass是否應該實現Serializable? 我們是否可以說因為將托管bean注入到@Singleton中,所以序列化永遠不會發生? 因此在部署時沒有顯示序列化錯誤嗎?

  1. 如果是:如果我使MyClass @ApplicationScoped和@Stateful並使用@EJB注入SomeManager,則在部署時確實會出現有關序列化的錯誤。
  2. 如果否:為什么我不會為臨時Logger收到一些NullPointerExceptions(由於無聊/激活)?

CDI范圍是在CDI容器的上下文中評估的。 也就是說,CDI規范的設計者確保了它可以與EJB和jsf Managed Bean一起使用。 那就是。

  1. CDI范圍在理想情況下是上下文相關的。 @ApplicationScoped表示CDI bean從創建實例到應用程序末尾都應存在。 它由CDI容器管理,與EJB Bean絕對無關。 但是由於與EJB的互操作性,可以將其注入(@Inject)到EJB @Singleton bean中。 EJB規范或CDI規范都沒有要求@Singleton bean或@ApplicationScope bean可序列化。 並且由於這是一個應用程序范圍的實例,因此不需要鈍化。

  2. @SessionScope使用當前容器希望的會話語義。 例如,在jsf應用程序中,通常將其范圍限制為HttpSession的生存期,但是在沒有HttpSession的EJB容器中,該容器將不會附加任何有意義的會話語義。 它可能決定是每個@Stateless事務或它希望執行的任何操作。 由於會話可以序列化,因此規范通常要求@SessionScoped bean是可序列化的,但是定義注入點的bean(如果不是@SessionScoped)則不需要序列化。

  3. @RequestScope還遵循“原子”動作(例如httprequest)的單次執行的語義。 在Web容器中,通常將其與HttpRequest關聯,並且不需要使其可序列化。 在非Web上下文中,它可能與每次調用甚至事務邊界(在注入到EJB的情況下)相關聯,或者在無法分配有意義的作用域的情況下,它將在注入點默認為@Dependent作用域。

也就是說,任何CDI bean都可以注入到任何EJB bean中。 通常,在與Web容器不關聯的EJB容器中,@ Dependent和@ApplicationScope是僅有的具有任何有意義用法的作用域。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM