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

时间:2012-03-06 20:58:50

标签: java interface singleton ejb ejb-3.1

我想访问无接口Singleton singletonA的多个实例singletonBMySingleton。实例首先在另一个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的性质,我不能通过引用传递单身人士。 最后,我想避免创建两个相同的MySingleton实现。

感谢收到的回答,我一直在重新考虑整个架构,我必须同意将MySingleton定义为有状态的事实也是好的。

2 个答案:

答案 0 :(得分:3)

我猜你意识到这是一个矛盾。 @Singleton只有一个实例,因此您不能有两个实例。可能你需要另一种bean(例如@Stateful ejb)

答案 1 :(得分:1)

首先,在Configurator中 MySingleton singletonA MySingleton singletonB 是相同的。这是因为@Singleton的唯一要点就是只有一个实例,无论注入多少次和注入的位置(在同一个JVM中)。 Container会在您第一次注入实例之前创建实例,之后将共享相同的实例。所以你也可以在 AnotherEJB 中再次注入(而不是只注入一次)。

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