如何在CDI中动态创建实例

pal*_*lto 12 java cdi java-ee-6

我们假设我有一个Car类.在我的代码中,我想创建10辆汽车.Car类有一些@Inject注释依赖项.这样做的最佳方法是什么?

CDI有一个Provider接口,我可以使用它来创建汽车:

@Inject Provider<Car> carProvider;
public void businessMethod(){
    Car car = carProvider.get();
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,如果我没有CarFactory,它有一个带有@Produces注释的方法来创建汽车,那就不行了.尽管它反映了现实世界我无法在没有工厂的情况下制造汽车,但我宁愿不为所有东西编写工厂.我只是希望CDI容器像任何其他bean一样创建我的汽车.你怎么建议我创造那些汽车?

tem*_*eva 10

只需使用javax.enterprise.inject.Instance接口即可.

像这样:

public class Bean {

    private Instance<Car> carInstances;

    @Inject
    Bean(@Any Instance<Car> carInstances){
        this.carInstances = carInstances;
    }

    public void use(){
        Car newCar = carInstances.get();
        // Do stuff with car ...
    }

}
Run Code Online (Sandbox Code Playgroud)


Mar*_*son 8

我最喜欢的编程查找模型是使用CDI.current().select().get().

在这里展示.

servlet依赖于两个CDI bean,一个请求作用域,另一个作用域作用域:

private final RequestScopedBean requestScoped
            = CDI.current().select(RequestScopedBean.class).get();

private final ApplicationScopedBean applicationScoped
            = CDI.current().select(ApplicationScopedBean.class).get();
Run Code Online (Sandbox Code Playgroud)

可以在此处找到使用此servlet的测试类.

检查代码,您会发现代码完全等同于您将使用的代码@Inject MyBean myBean;.