我想显示以下基于EJB
的代码的执行结果:
@Stateless
public class StatelessBean implements IsStatelessBean{
...
}
@Stateful
public class StatefulBean implements IsStatefulBean{
...
}
@Singleton
public class SingletonBean implements IsSingletonBean{
...
}
@Stateless
public class MyBean {
@EJB
IsStatelessBean slBean1;
@EJB
IsStatelessBean slBean2;
@EJB
IsStatefulBean sfBean1;
@EJB
IsStatefulBean sfBean2;
@EJB
IsSingletonBean singlBean1;
@EJB
IsSingletonBean singlBean2;
public String checkStatelessEqual() {
String areEqual;
if(slBean1.equals(slBean2))
areEqual = "are equal!";
else
areEqual = "are NOT equal!";
return "Stateless Beans "+areEqual;
}
public String checkStatefulEqual() {
String areEqual;
if(sfBean1.equals(sfBean2))
areEqual = "are equal!";
else
areEqual = "are NOT equal!";
return "Stateful Beans "+areEqual;
}
public String checkSingletonEqual() {
String areEqual;
if(singBean1.equals(singBean2))
areEqual = "are equal!";
else
areEqual = "are NOT equal!";
return "Singleton Beans "+areEqual;
}
}
当我从客户端调用方法时,结果是:
Stateless Beans are equal!
Stateful Beans are NOT equal!
Singleton Beans are equal!
我期望 Singleton
Beans 是相等的,但我没想到 Stateless
和 Stateful
的结果。
- 在这种情况下,
Container
从池中获得相同的Stateless
bean 实例是否只是巧合? Stateful
的正确之处是什么?尽管他们只有一个客户端,但是当客户端多次注入(inject)时是否会创建一个新的不同引用?
提示:equals
方法没有被覆盖,因此只比较引用。
最佳答案
这是预期的行为。
关于无状态 bean,来自 ejb 3.1 规范(第 3.4.7.1 节):
All business object references of the same interface type for the same stateless session bean have the same object identity...
对于有状态 bean,来自 ejb 3.1 规范(第 3.4.7.2 节):
Stateful session bean references ... to different session bean instances will not have the same identity.
这是有道理的,如果你遵守契约(Contract),你可以保证在无状态 bean 的两个实例中的任何一个上调用业务方法,将具有完全相同的效果,而有状态 bean 不一定是真的。
关于java - session Bean 上的 Equals 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21740003/