繁体   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