7

@ApplicationScopedCDI ( 、@SessionScopedおよび)でさまざまな Bean スコープを適用すると、どのように機能するのだろうか@RequestScoped。ライフサイクルは理解していますが、これらはコンテナのどこに保管されていますか? これらのアノテーションを JSF Bean で使用しています。

これらの Bean はサーバーにどのように格納され、サーバーはどの Bean が誰のものかをどのように知ることができますか。

たとえば、舞台裏@SessionScopedのオブジェクトに格納されている Bean はありますか? のマップ インスタンス変数に格納されているHTTPSessionBean はありますか? もしそうなら、スレッドセーフはどうですか。私はそれを誤解していると思いますが、誰かが何が起こるか、どこに保存されているか (さまざまなスコープ)、どの Bean が誰に属しているかをサーバーがどのように知ることができるかを誰かが教えてくれたら素晴らしいと思います...他の ID があるように(セッションIDだけでなく)?@ApplicationScopedServletContext

私はJava EE 6のすべての参照実装を使用しています。

4

1 に答える 1

3

たとえば、@ SessionScopedがバックグラウンドでHTTPSessionオブジェクトに格納されているBeanはありますか?@ApplicationScopedを持つBeanは、ServletContextのマップインスタンス変数に格納されていますか?

Webレイヤーの場合、それが実際に起こります。Beanがインスタンス化されている場合は、マップ内のすべてのオブジェクトを手動で反復処理することで、Beanを見つけることができます。

@RequestScopedでも特別なことです。Webレイヤーでは、これはリクエスト属性マップに対応しますが、このスコープは、リモートセッションBeanやメッセージを処理するメッセージ駆動型Beanなどへの呼び出しにも適用されます。その場合、httpリクエストがないため、リクエスト属性マップはありません。それらは「どこか別の場所」に保存されている可能性があります。おそらく、Beanプロキシによって設定および設定解除されたTLS(スレッドローカルストレージ)に保存されています。

もしそうなら、スレッドセーフはどうですか。

アプリケーションスコープとセッションスコープのBeanは、それ自体ではスレッドセーフではありません。たとえば、スレッドセーフなデータ構造、synchronizedキーワード、または本質的にスレッドセーフなBeanタイプ(@Stateful注釈付きBeanなど)を使用して、スレッドセーフに注意する必要があります

于 2012-04-13T17:07:12.567 に答える