JAVA EE CDI Scopes,EJB和托管bean序列化

时间:2014-09-18 09:26:10

标签: java-ee serialization jboss dependency-injection cdi

对范围,ejbs和托管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;
    
    }
    
  3. 容器(部署时间)或编译器没有抱怨它,这是正常的吗?

    我想:

      

    “使用会话,应用程序或会话范围的Bean必须是可序列化的,但使用请求范围的bean不必是可序列化的。”JAVA EE Using Scopes

    MyClass应该实现Serializable与否?我们可以说因为托管bean被注入@Singleton,序列化永远不会发生吗?因此,在部署时没有显示序列化错误?

    1. 如果是:如果我使用@EJB制作MyClass @ApplicationScoped和@Stateful并将其注入SomeManager,那么在部署时我会收到有关序列化的错误..
    2. 如果否:为什么我不为瞬态记录器获取一些NullPointerExceptions(由于过度/激活)?

1 个答案:

答案 0 :(得分:1)

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容器中,容器不会附加任何有意义的会话sematics。它可能决定是每个@Stateless交易或它所希望的任何事情。由于会话可以序列化,因此规范通常要求@SessionScoped bean可序列化,但定义注入点的bean(如果不是@SessionScoped)不需要可序列化。

  3. @RequestScope也遵循单个执行" atomic"的语义。行动,例如HttpRequest的。在Web容器中,它通常与HttpRequest相关联,并且不要求它可序列化。在非Web上下文中,它可以与每次调用相关联,甚至可以与事务边界相关联(在注入EJB的情况下),或者在注入点处默认为@Dependent范围,此时不能归因于有意义的范围。 / p>

  4. 也就是说,任何CDI bean都可以注入到任何EJB bean中。通常在与Web容器无关的EJB容器中,@ Dependent和@ApplicationScope是唯一具有任何有意义用法的范围。