我有一个无状态会话bean这需要访问的工厂类。 难道是最好声明这个工厂类作为SLSB静态或实例成员? 我在说正确的,因为SLSBs被重用,工厂只有一个实例将每一个bean创建(与实例成员选项去时),为每个请求而不是一个实例?
Answer 1:
SLSB实例池,因此服务在其生命周期可能很多请求,所以就像你说的实例变量不会被重建为每个请求。
为SLSB“自然”的方法是让每个实例独立,不静,没有必要实例之间的同步。 因此,如果有可能我不得不每SLSB实例的工厂实例。
Answer 2:
不要假设SLB的实例将不会按要求设立。 该容器是它的权利范围内创建一个每个请求; 同样,它也只允许有一个实例(我认为)。 更一般地,容器将保持他们的游泳池。
如果实例化和/或初始化您SLSB是相对昂贵的,你应该研究你的容器会怎么做,如果可能的话,将其配置来明确你想要做什么。
假如你这样做,那么就应该有与保持在SLSB类的实例字段没有问题。
Answer 3:
实例变量不是只要SLSB从池中重复重建。 SLSB的生命周期很简单:创建一个实例,使用了N次参加N个请求,并最终把它扔掉。 所有这些动作都是由容器进行。 所以在豆(美国控制)的创建过程中,我们可以初始化这些实例变量。 但从来没有修改这些变量的内容一旦被以避免副作用的初始化。
如果你想,但记住,你必须处理手动同步问题,您可以使用静态实例; 进而,你被限制到当地的工厂。
一个非常优雅的解决方案是由EJB 3.1与EJB的@Singleton提供。
文章来源: Static vs Instance members in Stateless EJBs