【发布时间】:2011-08-26 11:51:32
【问题描述】:
通常我使用@RequestScoped 或@SessionScoped(来自javax.enterprise.context)使用@Inject 注入对象(例如在faces bean 中)。
我也在使用 EJB。据我了解,一组无状态 EJB 副本(池)用于注入对象。有许多副本的原因是为了确保不会同时访问一个 EJB 实例。当谈到有状态的 EJB 时(正如我所理解的那样),其中一个实例与具体的注入点有关。它们是使用@EJB 注入的(也是无状态的)。
我经常可以在网络上看到将@Stateless 或@Stateful 与@Scoped 结合使用的示例。它们的含义是什么?
编辑:(试图澄清,因为此时没有人回应):
我特别感兴趣的是,这些作用域注释是否会以任何方式(如果它们 - 方式)改变 EJB 实例的创建时刻。
据我了解:如果我有 @EJB 带注释的字段,则将适当类的对象注入那里。如果这样的 EJB 是无状态的,容器只需从预先创建的实例池中获取免费实例。如有必要,可以调整池的大小。它是无状态的,因为不能保证在我们类的方法调用中保留对象(即具有包含对 EJB 的引用的字段的类)。
我们还可以使用有状态 EJB,在这种情况下,在方法调用期间会保留一个实例。正如我认为的那样,每次创建对象时都会简单地注入一次。 (还有单例 EJB,所有对象共享)。
我在这里找不到 EJB 的 @Scoped 注释的用途。
编辑 2:
如果要通过 EJB 和 DI(通过@Inject)机制注入类,则可以使用这种注释组合。然而,这是一种特殊情况,并不优雅。我问你是否知道其他原因。
编辑 3: 请在 arjan 的回答下查看我的评论。
【问题讨论】:
标签: java jakarta-ee ejb-3.0