如何在CDI 1.2中制作单例

时间:2017-05-21 13:16:11

标签: java java-ee cdi weld jboss-weld

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

谷歌搜索后,我仍然无法找到有关单身人士和CDI 1.2的信息。任何人都可以解释这种情况,并举例说明如何使用CDI 1.2制作单例CDI bean。

3 个答案:

答案 0 :(得分:2)

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

如果你想要一个带CDI的Singleton,请使用 @ApplicationScoped

答案 1 :(得分:2)

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

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

然后,CDI @Singleton的使用非常有限/特定,因为它是非代理伪范围。 在大多数情况下,@ApplicationScoped将完全符合您的要求,因此请确保在进行任何额外工作之前考虑这一点。

答案 2 :(得分:0)

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

只需创建这样的构造型:

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

...并像这样使用它:

@SingletonBean
class MyBean
{
}

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