如何在 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"
时被发现;不涉及代理。
我使用支持 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"
时被发现;不涉及代理。