2011-09-17 13 views

答えて

40

java:globalは、他のEARモジュール(異なるアプリケーションと見なされます)を含むアプリケーションサーバー全体でグローバルな名前空間です。

java:comp/envは、much small namespaceです。 Webモジュールの場合、JNDIのための単一の「コンポーネント」とみなされるすべてのWebコンポーネント(サーブレットなど)に対応しますが、EJB Beanの場合、単一のBeanの名前空間です。すべてのBeanは、別のコンポーネント。

また、java:appjava:moduleというスコープがグローバルとコンプライアンスの間にあるものもあります。

java:comp/envとの大きな違いは、前者は実行時に厳密には読み取り専用であり、いくつかのコンポーネントに注入されたBeanが含まれていることです。だから検討:この場合

@Stateless 
public class ExampleBean { 

    @EJB 
    OtherBean testBean; 

} 

を、フィールドtestBeanに注入した特定のプロキシもjava:comp/envから得ることができるが、場合にのみjava:comp/envする(JNDIは非常に文脈で)ExampleBean内から参照されています。

しかし、EJB OtherBeanとは別のプロキシが必要だった場合や、注入が行われていないときに参照が必要だった場合は、他のスコープの参照を取得できます。どのクラスからJNDI呼び出しを行っているかによって、より小さなスコープを使用することができます。例えば

OtherBeanExampleBeanと同じモジュールで定義されている場合、それは同じアプリケーション(しかし、おそらく異なるモジュール)だ場合、あなたはjava:appを使用することができ、java:moduleを使用することができます。

最後に、java:globalは、コンテキストに依存しないため、常に安全です。これは、たとえば管理されていない完全に別のスレッド。 java:globalを使用することの欠点は、EARが使用される場合はアプリケーション名とモジュール名、それ以外は少なくともモジュール名を含める必要があるということです。

関連する問題