arj*_*soh 1 java ejb equals java-ee
我想基于以下内容显示以下代码的执行结果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;
}
}
Run Code Online (Sandbox Code Playgroud)
当我从客户端调用方法时,结果是:
Stateless Beans are equal!
Stateful Beans are NOT equal!
Singleton Beans are equal!
Run Code Online (Sandbox Code Playgroud)
我预计Singleton
豆子是平等的,但我没想到结果Stateless
和Stateful
.
Container
获取相同的Stateless
bean 实例只是巧合吗?Stateful
?虽然它们只有一个客户端,但是当客户端不止一次注入时,会创建一个新的不同引用吗?提示:该equals
方法未被覆盖,因此仅比较了唯一的参考.
这是预期的行为.
关于无状态bean,来自ejb 3.1规范(Sec.3.4.7.1):
同一个无状态会话bean的相同接口类型的所有业务对象引用都具有相同的对象标识...
对于有状态bean,来自ejb 3.1规范(第3.4.7.2节):
有状态会话bean引用...到不同的会话bean实例将不具有相同的标识.
这是有道理的,如果您坚持合同,您可以保证在无状态bean的两个实例中的任何一个上调用业务方法将具有完全相同的效果,并且有状态的bean不一定是真的.