我对此真的很困惑。Enterprise Javabeans有一个管理bean生命周期的系统,它们是@Stateful、@Stateless和@Singleton,所以它显然是在管理生命周期。然而,CDI也有另一个与此对应的系统,包括@Dependent、@RequestScoped、@SessionScoped和@Application,它们看起来相当于EJB中的@Singleton。
如果我理解正确,EJB必须选择使用一个系统还是另一个系统?但是使用CDI提供了更细粒度的控制,例如EJB系统不识别请求与会话,哪个CDI识别呢?这是正确的吗?
还有一些书指出,CDI有上下文,而EJB生命周期管理没有,需要手动关闭资源。我不明白这是什么意思,因为EJB容器也在管理mean的生命周期,那么CDI提供而EJB不提供的“上下文”是什么呢?
谢谢
发布于 2015-04-13 15:29:58
CDI和会话Bean (@Singleton也是会话Bean)的语义略有不同:会话Bean为您提供事务管理和并发,而CDI不提供。当然,您可以为每个会话Bean编写一个生产者,并在应用程序中使用CDI注入它们。
发布于 2015-04-14 14:51:09
CDI在EJB之上提供了额外的特性。它们提供EJB (会话bean)的“上下文”生命周期管理。“上下文”意味着允许容器创建和销毁实例,并使它们可用于在相同上下文中执行的其他bean。你可以通过使用@RequestScoped等与作用域相关的注解来定义bean的上下文。我写了一个关于这方面的small blog post (可能会有帮助)。我强烈推荐阅读CDI specification document --第1.2.2、3.2、7.3.2、7.3.3节
https://stackoverflow.com/questions/29575473
复制相似问题