我想访问无接口Singleton MySingleton
的多个实例singletonA
和singletonB
。实例首先在另一个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(例如@Stateful
ejb)
首先,在Configurator中,MySingleton singletonA和MySingleton singleton B是相同的。这是因为@Singleton的全部目的是只有一个实例,无论它被注入多少次和在哪里(在同一JVM中)。容器在您第一次注入之前创建实例,然后共享同一个实例。因此,您还可以在AnotherEJB中再次注入(而不是仅注入一次)它。
即使我们假设没有Singleton的情况(例如Staless),使用@EJB进行注入也不会在其他地方产生可用于注入的新条目。所以,如果在类A中通过@EJB注入一些东西,就不能通过注入将引用传递给类B。要传递引用,方法调用是一种好方法。