15

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

这样做的最佳方法是什么?

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

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

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

您如何建议我创建这些汽车?

4

4 回答 4

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 ...
    }

}
于 2015-01-07T08:37:25.000 回答
9

我最喜欢的程序化查找模型是使用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;

于 2015-03-07T10:03:48.920 回答
3

您可以在@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<Car> carProvider;
于 2013-02-25T17:59:52.027 回答
0

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

于 2013-02-26T18:09:04.260 回答