我想知道...假设我在 ejb 3.1 中有两个无状态 bean:
@无状态类1
@EJB MyUniqueInstanceBean uniqueBean1;
2.
@Stateless
Class2
@EJB MyUniqueInstanceBean uniqueBean2;
uniqueBean1 和 uniqueBean2 是否保证是 MyUniqueInstanceBean 的唯一实例?
如果 MyUniqueInstanceBean 是无状态的,则对 uniquebean1 的调用不在您手中,而 uniquebean2 实际上对同一实例的调用。在 EJB 3.1 规范中,这是用下面的话来说明的:
因为无状态会话 bean 的所有实例都是等效的,所以容器可以选择将客户端调用的方法委托给任何可用的实例。这意味着,例如,容器可以将来自同一事务中的同一客户端的请求委托给不同的实例,并且容器可以将来自多个事务的请求交错到同一实例。
如果 MyUniqueInstanceBean 是Stateful,则保证 uniquebean1 和 uniquebean2 不引用同一个实例。再次来自规范:
当客户端通过依赖注入或 JNDI 查找获得对有状态会话 bean 实例的引用时,或者当客户端在会话 bean 的主接口上调用 create 方法时,会话 bean 实例的生命就开始了。这会导致容器在会话 bean 类上调用 newInstance 以创建新的会话 bean 实例。
如果您使用的是Singleton,那么两者都引用同一个实例,因为只有一个实例:
单例会话 bean 是每个应用程序实例化一次的会话 bean 组件。在容器分布在许多虚拟机上的情况下,每个应用程序将为每个 JVM 提供一个 Singleton 的 bean 实例。