[英]Equals method on Session Beans
我想展示基于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
怎么办? 尽管它们只有一个客户端,但是当一个客户端多次注入它时,是否会创建一个新的不同引用? 提示: equals
方法不会被覆盖,因此仅对引用进行比较。
这是预期的行为。
关于无状态Bean,根据ejb 3.1规范(第3.4.7.1节):
对于相同的无状态会话bean,具有相同接口类型的所有业务对象引用都具有相同的对象标识。
对于有状态Bean,根据ejb 3.1规范(第3.4.7.2节):
有状态会话bean引用...对不同会话bean实例的引用将不会具有相同的标识。
如果您遵守合同,这是有道理的,那么可以确保在无状态Bean的两个实例中的任何一个实例上调用业务方法都会产生完全相同的效果,而有状态Bean不一定是正确的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.