3

いくつかのBean、リスト、アイテムなどを生成するクラスがあるとしましょう

public class MightyProducer {

    @Produces
    public Bean1 someBean() {
         //some init
         return new Bean1();
    }

    @Produces
    @CoolItems
    public List<Items> items() {
        //some init
        return new ArrayList<Item>();
    }

}

このようなクラスのスコープはどうあるべきですか?それを任せるべきですか、@Dependentそれともベストプラクティスはありますか?シングルトンがこれに適しているとどこかで読んだことがありますが、そのCDI理由は本当にわかりません。

4

3 に答える 3

10

このスレッドは、この件に関して私が見つけた唯一のスレッドでした。完全に満足のいく答えが見つからなかったので、アノテーション付きの@Producesメソッドを含むクラスを一度宣言し、@ApplicationScopedアノテーションなしで一度宣言するという小さな実験を行いました。プライベート コンストラクターでのプロデューサー クラスのインスタンスの構築を追跡しました。

プロデューサー クラスに アノテーションが付けられている場合、@ApplicationScopedインスタンスが 1 つしか作成されないことがわかりました。これは明らかです。@Producesただし、アノテーションがないと、生成された型が注入された Bean のインスタンスが作成されるため、メソッドが呼び出されるたびに新しいインスタンスが作成されます。

@ApplicationScopedそのため、プロデューサー クラスを作成して (不要な) オブジェクトの作成を減らすことには少し意味があるかもしれません。しかし、オブジェクトの作成は現在非常に安価であると考えられているため、プロデューサー クラスに初期化する必要のある状態が少なくともある場合にのみ関連する可能性があります。

于 2016-03-08T10:03:35.147 に答える
2

プロデューサーを含むクラスのスコープはそれほど重要ではありませんが、生成されるアイテムのスコープは重要です。プロデューサー フィールド/メソッドにスコープ アノテーションがない場合、含まれているクラスのスコープでそのオブジェクトが生成されます。

于 2013-10-21T18:33:30.977 に答える
0

このクラスはステートレス (メンバー変数に値を格納しない) であり、スコープ付きインスタンスに依存しないため、シングルトンを安全に使用できます。

于 2013-10-18T07:42:56.853 に答える