如何在不使用限定符的情况下选择特定的bean实现?

时间:2016-05-10 11:08:14

标签: cdi

我在运行时通过我的应用程序中的producer提供注入服务接口的实现。

最近,协作团队中的某个人创建了相同服务接口的另一个实现,并且该类已添加到我的应用程序中无法避免的jar中。因此抛出ambiguous dependency exception,我可以通过生产者方法和注入点上的CDI限定符来解决这个问题。我想问是否有任何其他方法可以避免这种开销。我可以使用我的@Produces方法作为默认实现来使容器忽略第二个实现吗?我在生成器方法上添加了@Default注释和@Produces注释,以检查这是否解决了问题,因为默认情况下每次注入都使用@Default进行注释。但那没用。

2 个答案:

答案 0 :(得分:1)

您可以使用以下选项来避免为新实现创建新限定符的开销。

  1. 使用内置限定符@Named,它允许您通过String指定实现。 (但它不使用CDI型安全注射功能)

  2. 创建一个具有enum属性的限定符。每个枚举值代表一个实现。要注入的实现由此enum属性指定。 (注射是类型安全的。有关示例,请参阅this

答案 1 :(得分:0)

如果你不能使用@Vetoed注释第二个实现,我会编写一个CDI扩展,通过ProcessAnnotatedType

否决该类
private void vetoSecondImpl(@Observes ProcessAnnotatedType<YourSecondImpl> pat) {
    pat.veto();
}

以下是规范的参考:http://docs.jboss.org/cdi/spec/1.2/cdi-spec.html#init_events