我对 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。