私はJavaEEにまったく慣れていないので、ステートフルセッションBeanのインジェクションよりもJNDIルックアップを優先する理由がわかりません。(それは私がそれについてのレッスンのスライドで読んだものです)
2 に答える
一般に、JNDIルックアップは、インジェクションをサポートしていないコンテキストにいるときに実行されます。
あなたがそうする文脈にいるなら、まだいくつかの理由があります。1つは、注入するBeanがシリアル化され、逆シリアル化後に再注入する方法がわからない場合です(これは、クライアントで状態を使用する場合のJSFネイティブマネージドBeanで発生します)。
この最後の理由は、おそらく教師が考えていた理由かもしれません。ステートフルセッションBeanは非アクティブ化でき(その後シリアル化されます)、状況によっては、注入されたリソースもシリアル化されたくない場合があります。その場合、リソースをインスタンス変数に格納するのではなく、必要になるたびにJNDIに新しいリソースを要求します。
もう1つの理由は、JNDIを使用すると、取得するBeanをプログラムで決定できることですが、これはステートフルセッションBeanに固有のものではなく、あらゆるタイプのインジェクションに当てはまります。
上記は主にステートフルセッションBeanへの注入に関するものであることに注意してください。上記のMiljenが正しく述べているように、ステートフルセッションBeanを何かに注入するという問題もあります。(CDIの@ SessionScope、@ RequestScopeなどを介して)SFSBにもスコープを割り当てない場合、サーブレットまたは他の共有リソース(アプリケーションスコープのマネージドBeanなど)に注入すると、すべてのユーザーに同じSFSBが公開されます。これはおそらくあなたが望まないものです。
CDIを使用できない場合(たとえば、CDIが存在することを知らない場合)、JNDIを介してSFSBを取得することが回避策です。単一のメソッド呼び出しよりも長く状態を維持したい場合は、HTTPセッションなどのどこかに保存する必要があります。
サーブレットなどでSFSBの参照を取得しようとしていると仮定します。あなたの選択肢は何ですか?
a)@EJBアノテーションを使用してEJBを挿入する
b)JNDIルックアップ
オプションa)は、特定のサーブレットのすべての呼び出しで共有されるのと同じ参照を提供します。おそらく、または間違いなく、あなたが望む振る舞いではありません。オプションb)を選択します。これは、リクエストごとに新しいSFSB参照を取得し、呼び出しが完了するまで保持できるためです。