在长寿命对象上持有对无状态EJB的引用会发生什么?

时间:2017-11-22 12:08:33

标签: java java-ee ejb

只是一个思想实验。我知道绝对不应该如何使用它们,但我想知道系统如何会破坏或导致问题。

想象一个会话或应用程序作用域或任何其他类型的对象,其寿命比请求长。其中有一个@Stateless EJB字段,由构造函数或setter接收,并永久保存该引用。

EJB和容器会发生什么?

1 个答案:

答案 0 :(得分:2)

您的“无状态EJB字段”是对无状态EJB的引用。

但是,它不直接引用EJB实例。引用的对象是EJB的proxy

每次通过该代理调用方法时,容器都会创建或以其他方式获取对EJB实例的引用,然后调用它。容器可能具有这些EJB实例的池,以便它可以快速获取它们。它可以这样做,因为它们毕竟是Stateless

如果你有:

public class Foo {

    @EJB
    private Bar myStatelessEJB;

    public void doSomething() {
        myStatelessEJB.eat();
        myStatelessEJB.something();
    }

}

然后,myStatelessEJB的每次调用都可能会调用完全不同的Bar实例。

因此,保留EJB引用的时间没有区别。容器可能会在调用之间完全忘记它,或者它可能会将其返回到其他客户端的池中。