只是一个思想实验。我知道绝对不应该如何使用它们,但我想知道系统如何会破坏或导致问题。
想象一个会话或应用程序作用域或任何其他类型的对象,其寿命比请求长。其中有一个@Stateless EJB字段,由构造函数或setter接收,并永久保存该引用。
EJB和容器会发生什么?
答案 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引用的时间没有区别。容器可能会在调用之间完全忘记它,或者它可能会将其返回到其他客户端的池中。