1

我有一个需要访问工厂类的无状态会话 bean。最好将此工厂类声明为 SLSB 中的静态成员或实例成员?我是否正确地说,由于 SLSB 被重用,每个 bean 只会创建一个工厂实例(当使用实例成员选项时),而不是每个请求一个实例?

4

3 回答 3

1

SLSB 实例是池化的,因此在其生命周期内可能服务于许多请求,因此正如您所说,不会为每个请求重新创建实例变量。

SLSB 的“自然”方式是让每个实例独立,没有静态,不需要实例之间的同步。因此,如果可能的话,我会为每个 SLSB 实例提供一个工厂实例。

于 2009-10-13T07:24:44.350 回答
1

不要假设每个请求都不会创建 SLB 的实例。容器有权为每个请求创建一个;同样,它也允许只有一个实例(我认为)。更一般地,容器将维护它们的池。

如果实例化和/或初始化您的 SLSB 相对昂贵,您应该准确调查您的容器将做什么,并在可能的情况下将其明确配置为您希望它做什么。

假设你这样做了,那么在 SLSB 类中保留一个实例字段应该没有问题。

于 2009-10-13T07:27:49.260 回答
0

只要从池中重用 SLSB,就不会重新创建实例变量。SLSB 的生命周期相当简单:创建一个实例,使用它 n 次来处理 n 个请求,并最终将其丢弃。所有这些动作都由容器执行。所以在bean的创建过程中(由我们控制)我们可以初始化这些实例变量。但是一旦初始化,就不要修改这些变量的内容,以避免副作用。

如果您愿意,您可以使用静态实例,但请记住您必须手动处理同步问题;此外,您被限制在当地工厂。

带有@Singleton EJB 的EJB 3.1 提供了一个非常优雅的解决方案。

于 2012-10-26T10:03:14.347 回答