我有一个 EJB,它需要是单例和有状态的,因为它将成为一种连接池。我的问题是:
@Singleton
注释定义一个 EJB,那么它会默认是有状态的还是我还必须用 @Stateful
定义它?@Stateless
注释吗?试图找到一些关于这个的文档,但到目前为止没有运气。所以任何有知识的人,请分享你的智慧,也许还有一两个链接。
EJB tutorials 表明 EJB 可以是
Singleton
或 Stateful
或 Stateless
。我从未尝试过使用这些注释中的一种以上,但我坚信正确的做法是只使用其中一种。
从那个链接:
单例会话 bean 在客户端之间维护它们的状态 调用
所以,对于你的问题:
如果我用
注释定义一个 EJB,那么它会默认是有状态的,还是我必须也用@Singleton
定义它?@Stateful
如果对于 Stateful,您的意思是保持其状态的能力,答案是:是的,Singleton 默认情况下将是 Stateful。
请记住,在某些特定情况下,单身人士的行为并不像单身人士,请阅读这篇 article 关于这一点。通常,如果您在集群之外并避免使用默认构造函数,则不会冒这种风险:您需要始终使用 EJB 的引用,方法是将它注入另一个 EJB 或 Web 客户端,使用:
@EJB MyEJB myEJB;
最后,看看 Java EE 6 教程的this 部分,关于 EJB 的生命周期,解释了有状态和其他 EJB 之间的主要区别在于容器在其生命周期中被钝化的能力。这种差异是声明“默认情况下单例是有状态的”严格来说不正确,但在你的问题的上下文中是正确的主要原因。