2017-01-19 4 views
1

CDIには、CreationalContextBeanManager.getReferenceで分かりません。BeanManager.getReferenceで使用されるCreationalContextを破棄する必要はありますか?

私はWildfly 8.2.1でCDI 1.2を使用しています。ここに問題があります。

私はサードパーティのライブラリによって作成されたCDI Beanを持っています。

豆:

public class ProducedBean 
{ 
    private long m_id; 

    public long getId() 
    { 
     return m_id; 
    } 
} 

そしてプロデューサー(これは一例です):CDIカスタムスコープのコンテキストで

@Produces 
public ProducedBean getBean() 
{ 
    return new ProducedBean(); 
} 

、私はこのBeanにアクセスする必要があります。だから私は使用BeanManager

final Set<Bean<?>> beans = beanManager.getBeans(ProducedBean.class); 
final Bean<?> bean = beanManager.resolve(beans); 
CreationalContext<JobContext> creationalContext = beanManager.createCreationalContext(null); 
final ProducedBean producedBean = (ProducedBean) beanManager.getReference(bean, ProducedBean.class, creationalContext); 
// Get id of ProducedBean 
// Then release creationalContext? 

私はこのコードに関する2つの質問があります。

1°)私はProducedBean作成後creationalContextを破壊する必要がありますか?私はjavadocを読んだが、それは私には分かりません。私はちょうどProducedBeanのIDを取得したい。

2°)beanManager.createCreationalContext(null)またはbeanManager.createCreationalContext(bean)を使用する方が良いですか?私の場合、私はちょうどProducedBeanのIDを読んでいます。

ありがとうございました。

+0

WildFly 10では、CDI 1.2を使用しています(デフォルト)。 – Siliarus

+0

Actullyそれはwildfly 8です、私は私のポストを修正します。間違いを知らせてくれてありがとう。 – Rouliboy

答えて

2

まず、あなたのお豆はあなたがそれを扱う必要がある方法に苦しんでいる@Dependentです(私は意図的に願っています)。 @Dependentの場合、1回の注入につき1つのインスタンスがあり、それを注入したコンテキストBeanを破壊すると破棄されます。したがって、あなたの場合は、これを手動で処理する必要があります。今

、あなたに具体的な質問:

  1. コンテキスト自体を処理する必要はありません。代わりに、ProducedBeanで作業を終えたらBean<ProducedBean>オブジェクトに戻り、destroy(T instance, CreationalContext<T> creationalContext)メソッドを呼び出してください。この場合も、Beanが@Dependentであるため、これを行う必要があります。
  2. beanManager.createCreationalContext(bean)を使用することをお勧めします。その理由は、あなたのProducedBeanに(文脈上の)依存関係があるとします。他のものを注入する、これは注射を解決する。 nullを指定すると、正しくリコールすれば、インスタンス化されていないアンマネージドに対してのみ有効です。
+0

あなたの答えをありがとう、それは非常に明確です。ポイント2については、 'ProducedBean'の生成方法を知っているので、' beanManager.createCreationalContext(bean) 'の代わりに' beanManager.createCreationalContext(null) 'を使うべきではないのですか?私は 'ProducedBean'に注入されたBeanがないことを知っているので、注入を解決する必要はありません。 – Rouliboy

+0

あなたの質問は文脈依存がないことを意味するものではありません。その場合、 'null'メソッドを呼び出すだけで十分でしょう。 – Siliarus

+0

よろしくお願いいたします。私の最初の投稿では、プロデューサーを返すものについてはっきりしていないことは間違いありません。そのために残念。しかし、私は 'beanManagerを使ってテストしました。依存関係を注入したBeanとそれらが正しく注入された別のBeanで、「createCreationalContext(null)」を実行します。ですから、 'beanManager.createCreationalContext(null)'がどのような場合に使用されているのかは分かりません。とにかく、あなたの助けをありがとう! :-) – Rouliboy

関連する問題