据我了解 InjectionPoint 概念,您不能以这种方式将其与 Instance 一起使用。 Instance 和 InjectionPoint 与 producer-method 用于注入
Instance<Animal>
与所有 CDI 动物一起进入生产者方法,然后让生产者方法决定返回哪个动物,具体取决于 InjectionPoint:
public Animal make(@Any Instance<Animal> instance, InjectionPoint ip)
参见此处https://www.javacodegeeks.com/2013/06/java-ee-cdi-programmatic-dependency-disambiguation-example-injection-point-inspection.html
或者根据 Qualifier-Config-Inputs 生成一个配置的对象,像这里https://dzone.com/articles/cdi-di-p2
在您的情况下,您必须告诉 CDI,如何找到生产者方法:
@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface AnimalType {
String value();
}
然后就可以编写相应的生产者方法了:
@Produces
@AnimalType("Monkey")
public Animal makeAnimalApe() {
return new Animal("Cheetah");
}
@Produces
@AnimalType("Mouse")
public Animal makeAnimalMouse() {
return new Animal("Jerry");
}
@Produces
@AnimalType("Cat")
public Animal makeAnimalCat() {
return new Animal("Tom");
}
然后你就可以注入它了:
@Inject
@Any
private Instance<Animal> anyAnimal;
@Inject
@AnimalType("Monkey")
private Animal monkey;
@PostConstruct
public void create(){
System.out.println(monkey.name);
anyAnimal.forEach((a)->System.out.println(a.name));
}
但是在这种情况下,您必须为每个选择情况编写一个生产者方法。恐怕,那不合适。
要使用 InjectionPoint,您可以使 AnimalType 不是限定符
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface AnimalType {
String value();
}
现在你必须使用 InjectionPoint:
@Produces
public Animal makeAnimalApe(InjectionPoint p) {
AnimalType t = p.getAnnotated().getAnnotation(AnimalType.class);
if (t != null) {
String s = t.value();
if ("Monkey".equals(s))
return new Animal("Cheetah");
else if ("Mouse".equals(s))
return new Animal("Jerry");
else if ("Cat".equals(s))
return new Animal("Tom");
}
throw new EJBException("Please annotate the animal injection point with AnimalType");
}
但是由于缺少限定符 AnimalType,您不能将 Instance 注入到您的 bean 中。所以你必须像这样生成一个简单的列表:
@Produces
public List<Animal> produceAll(){
List<Animal> all = new ArrayList<>();
all.add(new Animal("Cheetah"));
all.add(new Animal("Jerry"));
all.add(new Animal("Tom"));
return all;
}
所以你可以只注入一个或全部
@Inject
@AnimalType("Monkey")
private Animal monkey;
@Inject
private List<Animal> all;