【发布时间】:2013-10-29 09:27:34
【问题描述】:
我对 CDI 完全陌生。
我习惯于在 XML (Spring) 中配置 bean。在 CDI 中,我应该直接在类中配置它们吗?我有数十个具有相同实现但配置不同的 bean。
【问题讨论】:
我对 CDI 完全陌生。
我习惯于在 XML (Spring) 中配置 bean。在 CDI 中,我应该直接在类中配置它们吗?我有数十个具有相同实现但配置不同的 bean。
【问题讨论】:
CDI 混合使用注释和 xml 配置来配置部署中哪些 bean 处于活动状态。这是一个很大的话题,但我会尝试总结一下:
在您的 bean 实现中,您可以使用以下标准注释:
@Default
@Alterative
@Vetoed
@Specializes
除非没有其他注释存在,否则假定为@Default
@Alternative bean 除非在 META-INF/beans.xml 中指定,否则不会处于活动状态
@Vetoed bean 永远不会被认为是活跃的
@Specializes bean 将始终优先于它们的超类。
除此之外,您还可以创建自己的限定符,以更准确地选择您想要用于什么目的的 bean。
您可以像这样创建一个限定符作为注释:
@Qualifier
@Retention(RUNTIME)
@Target({ TYPE, FIELD, PARAMETER, METHOD })
public @interface MyQualifier {
}
注意@Qualifier 和@Retention(RUNTIME) 注释。 您还可以向客户限定符添加参数。
我建议阅读 Weld 文档,它内容全面且写得很好:
【讨论】:
是的,配置发生在代码中。已经多次尝试进行基于 XML 的配置,请查找 Seam Config。
对于您的数十个 bean,您通常会使用生产者方法来创建具有自己配置的各个实现。 CDI 使用限定符而不是 bean id 来识别 bean。
【讨论】: