2011-07-05 14 views
13

Rozważmy następującą prośbę o zakresie CDI Fasola:Instancja Bean o krótszym zasięgu wstrzykniętym do instancji typu bean o większym zakresie w CDI - jak to działa?

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

Teraz wstrzyknąć go w aplikacji-scoped Fasola:

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

wpadłem ten kod i zauważył, że wniosek o zakresie instancji fasola różni się między dwoma żądaniami, ale instancja komponentu o zakresie o zasięgu aplikacji jest taka sama. Mam wątpliwości: jak to działa? Czy instancja komponentu bean o żądaniu jest ponownie przypisywana do pola o zasięgu aplikacji przy każdym żądaniu? Czy też proxy obszaru o zasięgu aplikacji po prostu zmienia się między żądaniami?

+5

Sprawdź [tutaj] (http://docs.jboss.org/weld/reference/latest/en-US/html/injection.html#d0e1429), aby dowiedzieć się, jak to działa. –

+0

@jangroth [4.9 Proxy klienta] (http://docs.jboss.org/weld/reference/latest/en-US/html/injection.html#_client_proxies) rozdział zawiera przegląd, ale nie wyjaśnia, jak to naprawdę działa . Konkretnie, co się dzieje, gdy pojedynczy komponent bean '@ ApplicationScoped' ma wstrzykniętą fasolę' @ SessionScoped' i otrzymuje dwie równoległe inwokacje z metod '@ RequestScoped'? – Alex

+1

* Zauważyłeś * że pytanie zadano 4 lata temu, a ten CDI/Weld (i jego dokumentacja) miał w międzyczasie kilka błędów wersji? ;) –

Odpowiedz

6

W CDI każdy wstrzyknięty obiekt jest faktycznie proxy. W takim przypadku proxy prawdopodobnie zawiera odniesienie do RequestContext, a przy każdym wywołaniu metody otrzymuje poprawną instancję komponentu bean.

+1

Prawda w rdzeniu, ale nie w szczegółach. Ziarna "DependentScoped" nigdy nie będą prokoryzowane, podobnie jak fasola "SingletonScoped". Oba zakresy są tak zwanymi pseudo zakresami. –

+0

Czy zakres zastosowania to pseudo zakres? Nie jestem tego pewien. W każdym razie, chodziło mi o konkretny przykład - kontekst żądania. – Bozho

+0

Nie, nie ApplicationScope, ale [SingletonScope] (http://docs.jboss.org/weld/reference/latest/en-US/html/scopescontexts.html#d0e1923) jest. Dlatego zawsze lepiej jest używać ApplicationScope :-) –