使用Wildfly / JBoss Weld / CDI 1.1。

假设您有一个数据库。可以是任何东西,MySQL,MongoDB。可能是REST服务。从该数据库中,您可以获得动物列表。

[
  "Cat",
  "Dog",
  "Giraffe",
  "Tiger",
  "Chicken"
]


您不知道将从此服务中获得哪些动物,但是您想要做的是使它们可用于实例注入。

动物类:

public class Animal {
  private final String type;
  public String getType() {
    return type;
  }
  public Animal(String aType) {
    type = aType;
  }
}


注射点:

@Inject @Any
public Instance<Animal> animals;


您可以创建一个制作动物的Producer方法,例如使用限定符来制作某种动物:

@Produces @AnimalType
public Animal makeAnimal(InjectionPoint ip) {
  // Get AnimalType qualifier and make a new Animal(typeString),
  // ...
  return animal;
}


但是,如何生产所有(从数据中得知)动物,以便您可以通过实例对它们进行迭代?

for(Animal animal : animals) {
  // ...
}


我确实希望每个动物都能从依赖注入和其他Weld / CDI好东西中受益。

最佳答案

看来您可能正在寻找Unmanaged

Unmanaged<Animal> unmanagedAnimal = new Unmanaged<>(Animal.class);
UnmanagedInstance<Animal> animalInstance = unmanagedAnimal.newInstance();
Animal animal = animalInstance.produce().inject().postConstruct().get();


它基本上是一个依赖范围的bean,但是完成后需要手动销毁它。

关于java - CDI动态Bean实例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36610488/

10-12 23:56