如何在CDI中动态创建实例

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

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

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

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

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

喜欢这个:

 public class Bean { private Instance carInstances; @Inject Bean(@Any Instance carInstances){ this.carInstances = carInstances; } public void use(){ Car newCar = carInstances.get(); // Do stuff with car ... } } 

我最喜欢的编程查找模型是使用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;获得的@Inject MyBean myBean;

您可以在@Produces注释中使用限定符:

 @Qualifier @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD, ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER}) public @interface MyCars { } 

样品生产者 – 方法:

 @Produces @MyCars public Car getNewCar(@New Car car){ return car; } 

用法:

 @Inject @MyCars private Provider carProvider; 

另一种方法是简单地不给Car任何CDI范围,这使得它依赖于每次注入时你将得到一个新实例,并且在包含实例被销毁之前不会销毁这些实例。