15

私が車のクラスを持っていると仮定しましょう。私のコードでは、10台の車を作成したいと思います。車のクラスには、いくつかの@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()です。

ここに示されています。

サーブレットは、2つのCDI Beanに依存しています。1つはリクエストスコープで、もう1つはアプリケーションスコープです。

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

private final ApplicationScopedBean applicationScoped
            = CDI.current().select(ApplicationScopedBean.class).get();

このサーブレットを使用するテストクラスは、ここにあります。

コードを調べると、コードがを使用して取得するものと完全に同等であることがわかります@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スコープを与えないことです。これにより、Carに依存し、注入されるたびに新しいインスタンスを取得し、それらのインスタンスは、含まれているインスタンスが破棄されるまで破棄されません。

于 2013-02-26T18:09:04.260 に答える