エリックB.:
JEE / CDIの文脈では、私はメソッドから静的にCDI管理対象Beanを取得する必要がある場合、通常CDIの静的な機能を使って自分自身を見つけます。例えば:
MyBean myBean = CDI.current().select( MyBean.class ).get()
しかし、何から私は、BeanManagerを使用しているこれを達成するための他の同等の方法を伝えることができます。
BeanManger bm = new InitialContext().lookup( "java:comp/BeanManager" );
Bean<?> bean = bm.resolve(bm.getBeans( MyBean.class ) );
CreationalContext<?> context = bm.createCreationalContext(bean);
MyBean myBean = bm.getReference(bean, cls, context);
使用して書き込みにコード大幅に少ないこと以外ので、他のCDI.current()
方法を、それを使用してどのような違いがあるのですか?使用に戻すことはように思わBeanManager
はるかに複雑(および潜在的にエラーが発生しやすい?)方法論です。機能的な観点からは、使用中に何らかの欠点があるCDI.current()
代わりの方法は?ないCDI...select()
だけのために働く@ApplicationScope
豆?:または私は他のスコープの豆(EXで使用できる@Dependent
だけでなく)?
私は、CDI方式を使用して、潜在的にメモリリークについて何かを読んで覚えているが、どのようにか、なぜこのようなケースかもしれない理解していません。
Siliarus:
しかし、2つの大きな違いの違いがある同様の結果が得られる両方のアプローチ。
CDI.current()
あなたはあなたが単純にすることはできませんものです@Inject BeanManager
。- これは、非CDI管理対象オブジェクトからCDIインスタンスのホールドを取得するだけの方法です
Instance.get()
取らないCreationalContext
のに対し、パラメータをBM.getReference()
行います。- これは、使用しているときという方法で、決定的な違いである
Instance
、CreationalContext
コンテナで管理されている-あなたはそれについて、特にコンテキストを解放する気にする必要はありません。あなたが使用している場合BM.getReference()
、あなたは、まず、通常、それを作成することを意味し、それはあなたがそれでの作業が完了した後も、それを解放するためにあなたが責任を保持するコンテキストを取得する必要があります。
- これは、使用しているときという方法で、決定的な違いである