会话Bean上的等于方法

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豆子是平等的,但我没想到结果StatelessStateful.

  1. 在这种情况下,从池中Container获取相同的Statelessbean 实例只是巧合吗?
  2. 什么是正确的Stateful?虽然它们只有一个客户端,但是当客户端不止一次注入时,会创建一个新的不同引用吗?

提示:该equals方法未被覆盖,因此仅比较了唯一的参考.

Cam*_*ilo 5

这是预期的行为.

关于无状态bean,来自ejb 3.1规范(Sec.3.4.7.1):

同一个无状态会话bean的相同接口类型的所有业务对象引用都具有相同的对象标识...

对于有状态bean,来自ejb 3.1规范(第3.4.7.2节):

有状态会话bean引用...到不同的会话bean实例将不具有相同的标识.

这是有道理的,如果您坚持合同,您可以保证在无状态bean的两个实例中的任何一个上调用业务方法将具有完全相同的效果,并且有状态的bean不一定是真的.