EJB 3.1的多个实例没有接口Singleton/Stateful会话bean



我想访问无接口Singleton MySingleton的多个实例singletonAsingletonB。实例首先在另一个Singleton Configurator类中定义:

MySingleton.java

@Singleton
@LocalBean
public class MySingleton {
    ...
}

Configurator.java

@Singleton
@Startup
@LocalBean
public class Configurator {
    @EJB MySingleton singletonA;
    @EJB MySingleton singletonB;
}

上面的代码看起来是有效的。

现在,我需要在一个消息驱动Bean中注入MySingleton的这两个实例:

MDB.class

@Stateless
public class MDB implements MessageListener {
    @EJB (lookup="?")      MySingleton singletonA;
    @EJB (mappedName="??") MySingleton singletonB;
}

但在这一点上,我完全迷失了方向。我知道我可以通过将2个实例定义为一个唯一接口的2个(空)实现来简化事情。但是我有一些问题,因为这个类包含一些非静态字段,所以我不能将它定义为接口。

编辑

由于MDB的性质,我不能通过引用传递Singleton。最后,我希望避免创建MySingleton的两个完全相同的实现。

感谢收到的答案,我一直在重新思考整个体系结构,我必须同意这样一个事实,即将MySingleton定义为Stateful也可以。

我想你已经意识到这是一个矛盾。@Singleton只有一个实例,所以不能有两个实例。您可能需要另一种bean(例如@Statefulejb)

首先,在Configurator中,MySingleton singletonAMySingleton singleton B是相同的。这是因为@Singleton的全部目的是只有一个实例,无论它被注入多少次和在哪里(在同一JVM中)。容器在您第一次注入之前创建实例,然后共享同一个实例。因此,您还可以在AnotherEJB中再次注入(而不是仅注入一次)它。

即使我们假设没有Singleton的情况(例如Staless),使用@EJB进行注入也不会在其他地方产生可用于注入的新条目。所以,如果在类A中通过@EJB注入一些东西,就不能通过注入将引用传递给类B。要传递引用,方法调用是一种好方法。

最新更新