我想访问无接口Singleton singletonA
的多个实例singletonB
和MySingleton
。实例首先在另一个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定义为有状态的事实也是好的。
答案 0 :(得分:3)
我猜你意识到这是一个矛盾。 @Singleton
只有一个实例,因此您不能有两个实例。可能你需要另一种bean(例如@Stateful
ejb)
答案 1 :(得分:1)
首先,在Configurator中 MySingleton singletonA 和 MySingleton singletonB 是相同的。这是因为@Singleton的唯一要点就是只有一个实例,无论注入多少次和注入的位置(在同一个JVM中)。 Container会在您第一次注入实例之前创建实例,之后将共享相同的实例。所以你也可以在 AnotherEJB 中再次注入(而不是只注入一次)。
即使我们假设没有Singleton(例如Staless)的情况,使用@EJB进行注射也不会在其他地方产生可用于注射的新条目。因此,如果你在A类中通过@EJB注入一些东西,你就不能通过注入传递引用到类B.要传递引用,方法调用是好方法。