0

Weld を使用して CDI を理解しようとしています。次の構造を取得しました。

@ApplicationScoped
public class MainFacade {

    @Inject
    private FooFacade fooFacade;

    private static int ins=0;

    public MainFacade() {
        super();
        ins++;
        System.out.println("MainFacade instance = "+ins);
    }

    public FooFacade getFooFacade() {
        return fooFacade;
    }
}

FooFacade も @ApplicationScope です。

アプリの起動時に MainFacade インスタンス = 1 を取得しました。それを他のクラス (GWT RPC サーブレット) に挿入し、mainFacade.getFooFacade() を呼び出すと、MainFacade の新しいインスタンスが fooFacade の新しいインスタンスと共に作成されます。

Weld は、どこに注入しても同じアプリケーション スコープ Bean のインスタンスを返すと考えました。私が間違っていることは何ですか?

4

2 に答える 2

3

このテストは、アプリケーション スコープの Bean が実際に「シングルトン」であることを確認するのにはうまく機能しないと思います。

この Bean を他の Bean に注入すると、Weld は、正しいインスタンスへのすべての呼び出しの委譲を処理するプロキシを作成します。これは、たとえば、リクエスト スコープの Bean をセッション スコープの Bean に挿入する場合に特に重要です。

プロキシは基本的に必要に応じて拡張MainFacadeされます。そうしないと、インジェクションが発生しているフィールドにプロキシをインジェクトでき​​ないためです。プロキシのインスタンスを作成すると、Bean のデフォルトのコンストラクターが実行されます。Weld は多くのプロキシを作成するため、コンソールに複数のログが表示されます。コンストラクターに次のようなものを追加することで、これを確認できます。

System.out.println("Type: "+this.getClass().getName());
于 2013-04-01T09:21:05.820 に答える