2012-03-06 97 views
0

我想访问无接口Singleton MySingleton的多个实例singletonAsingletonB。这些实例中的另一单例类Configurator首先定义:EJB 3.1的多个实例无接口Singleton /有状态会话Bean

MySingleton.java

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

Configurator.java

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

上面的代码,appearently工作。

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

MDB.class

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

但在这一点上,我完全失去了。我知道我可以通过将2个实例定义为一个独特接口的2个(空)实现来使事情更简单。但我有一些问题,因为该类包含一些非静态字段,所以我无法将其定义为接口。

由于MDB的性质EDIT

,我无法通过引用传递的单身。 最后,我想避免创建两个相同的MySingleton实现。

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

+0

基于编辑:单身人士通常与Stateful大不相同,但他们更符合Stateless bean。当你重新设计你的应用程序时,你可以考虑这个事实。无状态和Singleton都在请求的基础上工作(一般情况下)并且不保持状态。 – Bala 2012-03-07 20:44:44

回答

1

首先,在配置MySingleton singletonAMySingleton singletonB相同。这是因为@Singleton的整个观点是只有一个实例,无论注入次数多少(在同一个JVM中)。容器在第一次注入之前创建实例,之后将共享相同的实例。所以你可以去注入(而不是一次)它在AnotherEJB

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

+0

同意只有一个实例的单例。如果我让它有状态我怎么能得到AnotherEJB中的2个引用? – perissf 2012-03-06 21:25:11

+0

你可以有两个(但不同的实现)单身人士,只需将它们注入需要它们的地方。一般而言,您可以在方法调用中传递对bean的引用,而不是通过注入。使bean有状态或无状态在如何在别处引用它时不会发生太大的变化。 – 2012-03-06 21:35:32

+0

谢谢。我知道我没有很好地表达AnotherEJB的真实性质......我刚刚编辑了我的问题 – perissf 2012-03-06 21:47:21

3

我猜你认识到这是一个矛盾。 A @Singleton只有一个实例,所以你不能有两个。也许你需要另一种豆(一@Stateful EJB例如)

+0

是的,有状态可能是正确的选择 – perissf 2012-03-06 21:23:07

相关问题