ejb - javax.annotation.ManagedBean 所需的详细信息

ejb - Details requried on javax.annotation.ManagedBean

到处都有关于无状态、有状态Sigleton bean的大量信息,但几乎没有关于[=15的信息=] 但是没有完整的信息我不能使用它。

  1. 如果我用 @javax.annotation.ManagedBean 注释一个 class 它会是单例还是像无状态一样有实例池?
  2. 这样class里面的方法会并发吗?我应该确保在单例中它们默认是同步的。
  3. 我正在考虑用这个注释我的 DAO class,但是 @javax.enterprise.context.*; 范围让我怀疑。我认为 @Stateless 会更好。有什么意见吗?
  4. 如果不在 DAO 或服务 classes 上,这个注解适合哪里?

这个answer给出了很好的解释,但是没有回答上面的问题。

  1. 都没有。它们是每个 lookup/injection 个实例,更像是有状态的。

  2. 不,没有容器管理的并发。

  3. (和 4.)您需要事务、安全性或其他 EJB 功能吗?那么 @Stateless 可能更好。否则,我会直接使用 CDI,因为它几乎在所有方面都优于 @javax.annotation.ManagedBean 注释,并且它在 EE 7 中默认启用,因此它显然是 EE 的前进方向。

作为一点背景,@javax.annotation.ManagedBean 注释是在 EE 6 周期的开发后期添加的,并没有被广泛使用。托管 bean 规范旨在统一 EJB、CDI 和 JSF 托管 bean 组件模型的生命周期、注入和命名行为。这很有用,但在我看来,@javax.annotation.ManagedBean 注释只是事后的想法,它允许开发人员访问最小的组件模型功能,而无需 overhead/complexity(真实的或感知的)其他组件模型(EJB 必然有一组固定的必需服务和相关开销,CDI 几乎在所有方面都更好,但显然更复杂,并且 JSF 托管 bean 与 WAR 相关联)。然而,这个 "common denominator" 是一个非常有限的组件模型,只有 @PostConstruct、@Resource(和其他 EE 注入)和 @Interceptors。没有安全、事务、scoping/lifecycle(如在 EJB 或 CDI 中)、@PreDestroy、与 Web 层的紧密集成等