将@Stateful或@Stateless注入@Singleton EJB



我有一个@Singleton的EJB,其中我注入了另一个不是Singleton的EJB(它是@Stateless或@Statefull)。 例如

@Singleton
public class MySingleton {
@EJB
MyStatefulBean statefulBean;//this is stateful!
public void doSomething() {
statefulBean.something();
}
}

我的问题是:statefulBean总是有相同的参考,还是在每次调用doSomething()时都会有所不同?由于我们有一个单例,因此statefulBean始终具有相同的引用是有意义的。不过,我还是在问,因为我是EJB的新手,并且想确定一下。谢谢!

每次调用doSomething时 - 您statefulBean都会得到与 当前会话,负责此单一实例调用。在方法执行期间,单例 ejb 被锁定,没有其他 这个单例 ejb 的方法可以在具有 直接引用这个 EJB 通常是 EJB 对象自身,因为其他 对象获取代理对象引用。此外,在方法执行期间 不能将其他对象注入到此 EJB 中。这是可能的,因为 单例设计用于并发访问,默认并发设置 单例 ejb 是ConcurrencyManagementType.CONTAINERLockType.WRITE。 您可以更改此行为,但请记住,然后您 单例 EJB 可以同时从多个线程调用,你可以得到 意外结果 如果注入有状态对象,则特殊。 有关单例 EJB 的并发控制的更多信息,您可以在那里阅读。

我的问题是:有状态的Bean是否总是具有相同的引用,或者它会在每次调用doSomething()时有所不同?

以下是 EJB 规范对此的声明:

3.4.7.1有状态会话 Bean

有状态会话对象具有唯一标识,该标识在创建对象时由容器分配。有状态会话 Bean 业务接口的客户机可以使用 equals 方法确定两个业务接口或无接口视图引用是否引用同一会话对象。

例如

@EJB Cart cart1;
@EJB Cart cart2;
...
if (cart1.equals(cart1)) { // this test must return true
...  
}
...
if (cart1.equals(cart2)) { // this test must return false
...
}

同一有状态会话 Bean 实例对同一业务接口的所有有状态会话 Bean 引用都将相等。对同一有状态会话 Bean 实例的无接口视图的所有引用都将是相等的。对不同接口类型、接口类型与无接口视图之间或对不同会话 Bean 实例的有状态会话 Bean 引用将不具有相同的标识。

这意味着,一旦客户端获得了对有状态会话 Bean 的引用,该 Bean 就会绑定到客户端。客户端可以设置和读取 Bean 的状态。当客户端完成时,它必须通过调用由@Remove注释注释的方法来通知服务器应该销毁 Bean。

最新更新