2011-07-05 13 views
13

Considérese la siguiente petición con ámbito de CDI frijol:Instancia de frijol de un alcance más corto inyectado en una instancia de frijol de un alcance mayor en CDI: ¿cómo funciona?

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

Ahora, me inyecto en una aplicación de ámbito de frijol:

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

me encontré con este código y señaló que la instancia del bean petición de ámbito es diferente entre dos solicitudes, pero la instancia de bean con ámbito de aplicación es la misma. Mi duda es: ¿cómo funciona esto? ¿Se vuelve a atribuir la instancia de bean con ámbito de solicitud al campo con ámbito de aplicación en cada solicitud? ¿O el proxy del bean con ámbito de aplicación simplemente cambia entre las solicitudes?

+5

Compruebe [aquí] (http://docs.jboss.org/weld/reference/latest/en-US/html/injection.html#d0e1429) cómo funciona. –

+0

@jangroth [Proxies de cliente 4.9] (http://docs.jboss.org/weld/reference/latest/en-US/html/injection.html#_client_proxies) capítulo proporciona una visión general, pero no explica cómo funciona realmente . Específicamente, ¿qué sucede cuando un bean único @ @ ApplicationScoped' tiene un bean '@ SessionScoped' inyectado, y recibe dos invocaciones paralelas de los métodos' @ RequestScoped'? – Alex

+1

* ¿Te diste cuenta * de que la pregunta fue hecha hace 4 años, y que CDI/Weld (y su documentación) han tenido algunos baches de versión mientras tanto? ;) –

Respuesta

6

En CDI, cada objeto inyectado es en realidad un proxy. Entonces, en ese caso, el proxy probablemente contiene una referencia al RequestContext y en cada invocación de método obtiene la instancia de bean correcta.

+1

Verdadero en el núcleo, pero no en los detalles. Los beans 'DependentScoped' nunca serán proxies, ni tampoco los beans' SingletonScoped'. Ambos ámbitos son los llamados pseudo scopes. –

+0

¿El ámbito de aplicación es un pseudo ámbito? No estoy seguro de eso. De todos modos, mi punto era sobre el ejemplo particular - contexto de solicitud. – Bozho

+0

No, no ApplicationScope, pero [SingletonScope] (http://docs.jboss.org/weld/reference/latest/en-US/html/scopescontexts.html#d0e1923) es. Es por eso que siempre es mejor usar ApplicationScope :-) –

Cuestiones relacionadas