2012-04-13 17 views
7

Me pregunto cómo funciona la aplicación de los diferentes ámbitos de frijol en CDI (@ApplicationScoped, @SessionScoped y @RequestScoped). Entiendo el ciclo de vida, pero ¿dónde están almacenados en el contenedor? Estoy usando estas anotaciones en beans JSF.¿Cómo funcionan los diferentes ámbitos de beans en el servidor?

Cómo se almacenan estos granos en el servidor y cómo es capaz el servidor de saber qué granos pertenecen a quién.

por ejemplo, es un grano que tiene un @SessionScoped almacenada en el HTTPSession objeto detrás de las escenas? ¿Los beans con @ApplicationScoped se almacenan en una variable de instancia de mapa en ServletContext? Si es así, ¿qué pasa con la seguridad del hilo? Supongo que lo he entendido mal, pero sería genial si alguien pudiera enseñarme qué sucede, dónde se almacenan (los diferentes ámbitos), cómo es capaz el servidor de saber a qué granos pertenece quién ... como si hubiera otros identificadores. (no solo identificación de sesión)?

Estoy por cierto usando Java EE 6 todas las implementaciones de referencia.

Respuesta

3

Por ejemplo, ¿un bean que tiene un @SessionScoped almacenado en el objeto HTTPSession detrás de las escenas? ¿Los beans con @ApplicationScoped están almacenados en una variable de instancia de mapa en ServletContext?

Para la capa web, eso es lo que ocurre. Si el bean ha sido instanciado, a menudo puede encontrarlo de nuevo iterando manualmente sobre todos los objetos en dichos mapas.

@RequestScoped es algo especial. En la capa web esto corresponde con el mapa de atributos de solicitud, pero este alcance también se aplica a llamadas a, p. beans de sesión remota, o beans controlados por mensajes que procesan un mensaje. En ese caso, no hay una solicitud HTTP y, por lo tanto, no hay un mapa de atributos de solicitud. Es probable que esos se almacenen "en otro lugar", probablemente en TLS (almacenamiento local de subprocesos) que establece y desarma el proxy de frijol.

Si es así, ¿qué pasa con la seguridad de la rosca.

La aplicación y los beans de ámbito de sesión por sí solos no son seguros para subprocesos. Usted tiene que encargarse de la seguridad de subprocesos, por ejemplo, mediante el uso de estructuras de datos seguras para subprocesos, la palabra clave sincronizada o un tipo de bean inherentemente seguro para subprocesos (como un bean @Stateful annotated).

+0

Ok, entonces no hay más "hocus pocus" que :) Pero, entiendo que '@ ApplicationScoped' AKA ServletContext no es peligroso porque varios clientes podrían intentar cambiarlo al mismo tiempo ... pero ¿Por qué no es seguro el subproceso '@ SessionScoped'? ¿No es solo un cliente el que tiene acceso al mismo bean? – LuckyLuke

+0

Para 'SessionScoped' prácticamente no hay límite de cuántas solicitudes pueden acceder simultáneamente. Por supuesto, todos provienen del mismo cliente. Piensa en múltiples ventanas, múltiples pestañas o múltiples solicitudes AJAX provenientes de la misma ventana. –

+0

Ok, entonces mencionaste si un bean es intrínsecamente seguro para subprocesos como los EJB (algunos tipos al menos) ... entonces quieres decir que se mantiene como una propiedad de un frijol usado en JSF ¿verdad? – LuckyLuke

Cuestiones relacionadas