会话Bean上的等于方法

时间:2014-02-12 21:25:25

标签: java java-ee ejb equals

我想显示基于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 Bean相等,但我没想到StatelessStateful的结果。

  1. 在这种情况下,Container从池中获取Stateless bean的相同实例只是巧合吗?
  2. Stateful的正确之处是什么?虽然它们只有一个客户端,但是当客户端不止一次注入时,会创建一个新的不同引用吗?
  3. 提示:equals方法未被覆盖,因此仅比较了唯一的引用。

1 个答案:

答案 0 :(得分:5)

这是预期的行为。

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

  

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

和有状态bean,来自ejb 3.1规范(Sec.3.4.7.2):

  

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

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