2011-07-05 11 views
13

Aşağıdaki isteğe bağlı CDI fasulyesini göz önünde bulundurun:Daha kapsamlı bir kapsamın Bean örneği, CDI'da daha geniş kapsamlı bir fasulye örneğine enjekte edildi - nasıl çalışıyor?

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

Şimdi, ben bir uygulama-scoped fasulye enjekte:

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

Bu kodu çalıştırdım ve istek-scoped fasulye örneği olduğunu kaydetti iki istek arasında farklıdır ancak uygulama kapsamındaki fasulye örneği aynıdır. Benim şüphem: Bu nasıl çalışır? İstek kapsamındaki fasulye örneği, her istekte uygulama kapsamlı alanına yeniden mı yazıldı? Veya başvuru kapsamındaki fasülyenin proxy'si sadece talepler arasında değişir mi?

+5

Nasıl çalıştığını öğrenmek için [burada] (http://docs.jboss.org/weld/reference/latest/en-US/html/injection.html#d0e1429) kontrol edin. –

+0

@jangroth [4.9 Müşteri Proxy'leri] (http://docs.jboss.org/weld/reference/latest/en-US/html/injection.html#_client_proxies) bölümü genel bir bakış sunuyor ancak nasıl çalıştığını açıklamıyor . Spesifik olarak, bir '@ ApplicationScoped 'fasulyesinin bir' @ SessionScoped' çekirdeği enjekte edildiğinde ve' RequestScoped 'yöntemlerinden iki paralel çağrı aldığında ne olur? – Alex

+1

* Sorunun 4 yıl önce sorulduğunu ve CDI/Weld'in (ve belgelerinin) bu arada birkaç sürümde çarpma olduğunu farkettiniz. ;) –

cevap

6

CDI'de her bir enjekte edilen nesne aslında bir proxy'dir. Bu durumda, proxy muhtemelen RequestContext'a bir başvuruda bulunur ve her bir yöntemde, doğru fasulye örneğini alır.

+1

Çekirdek içinde doğru, ancak ayrıntıda değil. 'BağımlıScoped' çekirdekleri hiçbir zaman, 'SingletonScoped' çekirdeklerinin yanına alınmaz. Her iki kapsam da sözde kapsamlarıdır. –

+0

Uygulama kapsamı sözde bir kapsam mıdır? Bundan emin değilim. Her neyse, benim amacım özel örnekle ilgiliydi - istek bağlamı. – Bozho

+0

Hayır, ApplicationScope değil, [SingletonScope] (http://docs.jboss.org/weld/reference/latest/en-US/html/scopescontexts.html#d0e1923) 'dir. Bu yüzden ApplicationScope :-) kullanmak her zaman daha iyidir –

İlgili konular