3

何らかの方法でプーリングを許可しますか?CDIこれは Bean の機能だと思っていたのでEJB、Adam Bien はこのスクリーンキャストで、コンテナがリフレクションを通じてクラスの新しいインスタンスを作成するか、既存のものを使用するかを選択すると述べています。たとえば、これらの 2 つの Bean があるとします。

@RequestScoped
public class RequestBean {

    public void doIt() {

    }
}

@SessionScoped
public class SessionBean {

    @Inject
    private RequestBean bean;    

    public void doSomething() {
        bean.doIt();
    }
}

問題はRequestBean、呼び出し時に作成された新しいインスタンスが常に存在するのdoSomethingか、それともCDIコンテナーがプール内のインスタンスを何らかの形で管理しているのかということです。

4

1 に答える 1

10

最初のものはリクエストにスコープされるため、リクエストごとに新しいインスタンスが作成されます。2 つ目はセッションを対象としているため、セッションごとに新しいものが作成されます。

CDI は、オブジェクトがステートフルかどうかわからないため、オブジェクトをプールしてリサイクルしません。リクエストで、Bean が以前のリクエストで持っていた状態を取得したくないからです。それは、リクエスト/セッションスコープの要点全体を台無しにします。

Bean の作成に本当にコストがかからない限り (新しい接続を開始するなどの理由で)、Bean をプールしても何の利点もありません。最近では、有効期間の短いオブジェクトの作成とガベージ コレクションが非常に高速です。また、Bean の作成に非常にコストがかかる場合は、おそらくシングルトンにする必要があります。

于 2013-05-23T20:56:39.523 に答える