如何在 CDI 1.2 中创建单例

How to make a singleton in CDI 1.2

我使用支持 CDI 1.2 的 weld 2.3.5。我遇到了一个问题,即用 @javax.inject.Singleton 注释的 CDI bean 被容器 (bean-discovery-mode="annotated") 忽略了。

谷歌搜索后我仍然找不到关于单例和 CDI 1.2 的信息。谁能解释一下情况并举例说明如何使用 CDI 1.2 制作单例 CDI bean。

当 discovery-mode = annotated 时,Weld 不会识别具有 @Singleton 的 bean,因此不会加载它们,因为 @Singleton 不是正常范围。

如果你想要一个带 CDI 的单例,使用 @ApplicationScoped

使用 bean 发现模式 annotated,CDI 将仅拾取使用所谓的 bean 定义注释 注释的 bean。 spec clearly defines these,如您所料,@Singleton 不在其中。

要使您的单例可识别,最简单的方法是 使用发现模式 all 但我想您希望避免这种情况。在这种情况下,也许可以使用 扩展 来注册您的单例的注释类型 - CDI 应该能够从那里获取。

再一次,CDI @Singleton 的用法非常 limited/specific 因为它是一个非代理伪作用域。 在大多数情况下,@ApplicationScoped 完全按照您的意愿行事,因此请务必在做任何额外工作之前考虑到这一点。

好的,这是一个老问题,可能我的解决方案来得太晚了:)

只需创建一个像这样的刻板印象:

@Stereotype
@Singleton
@Target( TYPE )
@Retention( RUNTIME )
@interface SingletonBean
{
}

... 并像这样使用它:

@SingletonBean
class MyBean
{
}

这样MyBean就会在bean-discovery-mode="annotated"时被发现;不涉及代理。