CDI:@Specializes bean只能替换一个bean吗?

时间:2015-10-16 16:09:51

标签: java dependency-injection cdi

Env:
    Wildfly 9.0.1
    Weld 2.2.14

按照CDI规范和@Specializes的工作方式,在我看来@Specializes bean只能替换' a 'bean /实现而不是' some '豆/实现。

鉴于接口和限定符提供的灵活性,我发现这很奇怪。

让我通过示例代码给出方案:

Bean类:

interface Animal {
  public String getName();
}

@Siamese
public class Cat implements Animal {
  @Override
  public String getName() {
    return "Siamese";
  }
}

@Labrador
public class Dog implements Animal {
  @Override
  public String getName() {
    return "Labrador";
  }
}

注射点:

@Siamese
@Inject
private Animal cat;

@Labrador
@Inject
private Animal dog;

鉴于代码,我的目的是提供一个@Specializes模拟bean,它可以注入上面列出的两个注入点。这是模拟bean

@Alternative
@Specializes
public class MockAnimal implements Animal {
  @Override
  public String getName() {
    return "Mock Animal";
  }
}

但这似乎是不可能的,因为MockBean必须“扩展”它需要专门化的任何bean。

想要和你们一起检查一下除了创建MockDog和MockCat之外是否有其他工作。

提前致谢,

勒凯什

1 个答案:

答案 0 :(得分:0)

通常,您想要使用的只有@Alternative而没有@Specializes,并添加您希望注入bean的所有限定符。只有当您希望新bean完全覆盖旧bean而不复制其限定符时,甚至对于使用@Specializes注释的注入点时,才需要@Any

您的解决方案就是:

@Alternative
@Labrador
@Siamese
public class MockAnimal implements Animal {
  @Override
  public String getName() {
    return "Mock Animal";
  }
}

唯一不会覆盖CatDog bean的注入点将是@Any的注入点,如下所示:

@Any
Instace<Animal> allAnimals;

这将列出Animal的所有3个实现,即使启用了替代方案。但似乎这不是你的担忧。