如何在 CDI 中动态创建实例

2022-09-03 13:21:38

假设我有一个汽车类。在我的代码中,我想创建10辆车。Car 类具有一些带注释的依赖项。@Inject

最好的方法是什么?

CDI有一个界面,我可以用来创建汽车:Provider

@Inject Provider<Car> carProvider;
public void businessMethod(){
    Car car = carProvider.get();
}

不幸的是,如果我没有一个具有创建汽车的注释方法,则不起作用。尽管它反映了现实世界,我不能在没有工厂的情况下制造汽车,但我宁愿不为所有事情写工厂。我只是想让CDI容器像任何其他豆子一样创建我的汽车。CarFactory@Produces

你如何建议我创造这些汽车?


答案 1

只需使用界面即可。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 ...
    }

}

答案 2

我最喜欢的编程查找模型是使用 .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();

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

检查代码,您会注意到该代码与您使用 .@Inject MyBean myBean;


推荐