java - session Bean 上的 Equals 方法

标签 java jakarta-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 Beans 是相等的,但我没想到 StatelessStateful 的结果。

  1. 在这种情况下,Container 从池中获得相同的 Stateless bean 实例是否只是巧合?
  2. 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/

相关文章:

java - 为什么 ArrayList<ArrayList<T>> 到 Iterable<Iterable<T>> 的隐式转换是不可能的?

java - Clojure/Java - 弹出窗口

java - 组织 JDBC 项目

java - 嵌套 JSON 的问题

java - Wildfly 16.0.0.Final 和 ejb-client 与安全领域的连接

java - 如何在 ibm i 服务器上运行 java 程序

java - KafkaStreams serde异常

java - Glassfish - EAR 包的 3.1.2 部署需要很长时间

java - 查找失败 "Root exception is javax.naming.NameNotFoundException"

java - 如何解决 Singleton EJB 的初始化失败