0

JSF アプリケーションで Myfaces CODI @ViewAccessScoped バッキング Bean を使用しています。利点の 1 つは、ビュー間で情報をやり取りするためにビュー パラメーターを使用する必要がないことです。レコード @ViewAccessScoped は、新しいビューの最初のリクエストがアクセスしなくなるまで、Bean がアクセス可能であることを保証します。page1 から page2 に文字列値を渡したい場合を考えてみましょう。

Page1Bean.java (page1.xhtml のバッキング Bean)

@Inject private Page2Bean page2Bean;
private String source = "Hello, World!";

...
page2Bean.setTarget(source);

Page2Bean.java (page2.xhtml のバッキング Bean)

private String target;

page1 から page2 に直接移動すると、page2 から #{page2Bean.target} にアクセスすると、値は「hello, world!」になります。

実際には、データを page1 ビューから page2 ビューにプッシュしています。もう 1 つのオプションは、page1 ビューから page2 ビューにデータをプルすることです。つまり、page2Bean で @Inject Page1Bean と @ViewAccessScoped を使用すると、page1Bean.getSource() にアクセスできるようになります (前のビューにある限り)。

これで問題ありませんが、現実の世界では、ユーザー入力に応じて、page1 から他の多くのページのいずれかに移動したい場合があります。したがって、 Page1Bean.java は次のようになります。

Page1Bean.java (改訂版)

@Inject private Page2Bean page2Bean;
@Inject private Page3Bean page3Bean;
@Inject private Page4Bean page4Bean;
@Inject private Page5Bean page5Bean;
@Inject private Page6Bean page6Bean;
@Inject private Page7Bean page7Bean;
@Inject private Page8Bean page8Bean;

私の質問ですが、page1Bean のメモリ フットプリントには常に page2Bean-page8Bean が含まれますか? または、実行時に @Inject された Bean の 1 つにアクセスする場合にのみメモリが使用されますか?

これがあまりにも素朴な質問ではないことを願っていますが、それがどのように機能するか正確にはわかりません。最初の質問に対する答えが「はい」の場合、多かれ少なかれ @SessionScoped! を使用することになります。

明確にしていただきありがとうございます。

4

2 に答える 2

0

まあ、それは本当に明白だったと思いますが、@ Injectで注入されていたBeanのコンストラクターにいくつかのロギングを入れたので、Page1Beanがインスタンス化されたとき、つまりpage1に移動したときにすべてがインスタンス化されていたことがわかりました。JSR-299CDI仕様のセクション5.6プログラムによるルックアップで解決策を見つけました。

@Inject private Instance<Page2Bean> page2BeanDynamic;
...
if(someCondition) {
  Page2Bean page2Bean = page2BeanDynamic.get();
  page2Bean.setTarget(source);
}

したがって、これは基本的に動的な@Injectであり、実行時に必要な場合にのみBeanをインスタンス化するようにします。

finalize()メソッドと@PreDestroyメソッドをPage2Beanに配置すると、予想どおり、page2からpage1に移動するときに両方が呼び出されることがわかります。

于 2011-12-02T13:01:33.473 に答える
0

実メモリ フットプリントはありません。プロキシのみが生成されます。これがコンストラクター呼び出しの理由です。Bean を手動で解決する必要はありません。

すべての Bean を注入する必要はありません。あなたはそれを間違った方法で使用しています。_独立した_ページ間で状態を維持するだけで、@WindowScopedを介して行う必要があります。それらが独立していない場合は、ターゲット ページで Bean を使用します (ターゲット ページでビュー コントローラー コールバックが必要ない場合)。

于 2011-12-02T13:43:51.257 に答える