2011-07-05 9 views
13

は、次の要求スコープCDI Beanを検討:CDIのより大きなスコープのBeanインスタンスに挿入された、より短いスコープのBeanインスタンス - どのように動作しますか?

@RequestScoped 
public class RequestScopedBean { 
    // ... 
} 

は今、私はアプリケーションスコープのBeanにそれを注入:

@ApplicationScoped 
public class ApplicationScopedBean { 
    @Inject private RequestScopedBean requestScopedBean; 
    // ... 
} 

私はこのコードを実行し、要求スコープBeanインスタンス留意しました2つの要求では異なりますが、アプリケーションスコープのBeanインスタンスは同じです。疑いの余地はない:これはどのように機能するのか?リクエストスコープのBeanインスタンスは、リクエストごとにアプリケーションスコープのフィールドに再割り当てされますか?あるいは、アプリケーションスコープのBeanのプロキシはリクエスト間で変更されますか?

+5

動作については、[こちら](http://docs.jboss.org/weld/reference/latest/en-US/html/injection.html#d0e1429)を参照してください。 –

+0

@jangroth [4.9クライアントプロキシ](http://docs.jboss.org/weld/reference/latest/en-US/html/injection.html#_client_proxies)の章で概要を説明しますが、実際の動作を説明しません。具体的には、単一の '@ApplicationScoped' Beanに' @ SessionScoped' Beanが注入され、 '@ RequestScoped'メソッドから2つの並行した呼び出しを受け取るとどうなりますか? – Alex

+1

* 4年前に質問されたこと、CDI/Weld(とそのドキュメント)にはバージョンバンプがいくつかあったことにお気づきの点がありましたか? ;) –

答えて

6

CDIでは、注入された各オブジェクトは実際にはプロキシです。その場合、プロキシはおそらくRequestContextへの参照を保持しており、各メソッド呼び出しで正しいBeanインスタンスが取得されます。

+1

コアでは真ですが、詳細ではありません。 'DependentScoped' Beanは' SingletonScoped' Beanだけでなく、決してプロキシされません。両方のスコープはいわゆる擬似スコープです。 –

+0

アプリケーションスコープは疑似スコープですか?私はそれが分からない。とにかく、私の要点は、特定の例 - 要求のコンテキストに関するものでした。 – Bozho

+0

いいえ、ApplicationScopeではなく、[SingletonScope](http://docs.jboss.org/weld/reference/latest/en-US/html/scopescontexts.html#d0e1923)です。だから、常にApplicationScopeを使うほうがいいです:-) –

関連する問題