【问题标题】:Multiple instances of EJB 3.1 no-interface Singleton / Stateful session beanEJB 3.1 无接口单例/有状态会话 bean 的多个实例
【发布时间】:2012-03-24 09:50:44
【问题描述】:

我想访问无接口单例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;
}

上面的代码,貌似有效。

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

MDB.class

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

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

编辑

由于 MDB 的性质,我不能通过引用传递单例。 最后,我想避免创建两个相同的 MySingleton 实现。

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

【问题讨论】:

  • 基于编辑:单例通常与有状态的非常不同,但它们更好地匹配无状态 bean。当你重新设计你的应用程序时,也许你可以考虑这个事实。 Stateless 和 Singleton 都基于请求(通常)工作并且不维护状态。

标签: java interface singleton ejb ejb-3.1


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    首先,在Configurator中MySingleton singletonAMySingleton singletonB是一样的。那是因为@Singleton 的全部意义在于只有一个实例,无论它被注入多少次和在哪里注入(在同一个 JVM 中)。容器在您第一次注入之前创建实例,之后将共享相同的实例。所以你也可以在 AnotherEJB 中再次注入(而不是一次)它。

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

    【讨论】:

    • 同意单例只有一个实例。如果我让它有状态,我怎样才能在 AnotherEJB 中获得 2 个引用?
    • 你可以有两个(但不同的实现)单例,然后在你需要的地方注入它们。通常,您可以在方法调用中传递对 bean 的引用,而不是通过注入。使 bean 有状态或无状态在如何在其他地方引用它方面没有太大变化。
    • 谢谢。我知道我没有很好地表达 AnotherEJB 的真实性质......我刚刚编辑了我的问题
    • 有状态 bean 听起来根本不像解决方案,尤其是因为 MDB。忘记配置器,实现两个不同的单例(也许单例是不错的选择,很难说,因为我不知道它们在你的程序中的用途)并将它们注入你的 MDB。
    猜你喜欢
    • 1970-01-01
    • 2013-04-30
    • 2023-03-12
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    • 2015-01-21
    • 2011-08-04
    相关资源
    最近更新 更多