jsf 2 - mkyong - Lifecycle of FacesContext?
primefaces (1)
¿Esto significa que
FacesContext
nunca irá a la recolección de basura, y la instancia se destruirá solo cuando la aplicación weba actual se detenga (el servidor está detenido)?
No, lo lees mal. FacesContext
vive tanto como una sola solicitud HTTP. Será (en realidad, "puede" es una palabra mejor) no ser inmediatamente GC si hace una referencia incorrecta en cualquier parte de su propio código más allá de su alcance. Por ejemplo, como propiedad de un bean gestionado de ámbito de sesión que dura más que una sola solicitud HTTP:
@ManagedBean
@SessionScoped
public class BadSessionBean {
// Bad Example! Never do this! Not threadsafe and instance can''t be GC''ed by end of request!
private FacesContext context = FacesContext.getCurrentInstance();
}
Si no está haciendo eso en ninguna parte de su código y, por lo tanto, siempre está obteniendo la instancia actual en el alcance local del método, entonces tendrá la oportunidad de recibir una GC adecuada.
@ManagedBean
@SessionScoped
public class GoodSessionBean {
public void someMethod() {
// OK! Declared in method local scope and thus threadsafe.
FacesContext context = FacesContext.getCurrentInstance();
}
}
Tenga en cuenta que este comportamiento de GC no es específico de JSF / FacesContext
, sino que es específico de Java básico en general.
¿
FacesContext
sigue el patrón singleton? En ese caso, ¿cómo se comportará cuando se solicite varias veces y se presente simultáneamente la respuesta de renderizado, ya que solo atiende una solicitud por vez?
No, definitivamente no es un singleton. Es una instancia de ThreadLocal
creada por FacesServlet
inmediatamente después de que el método FacesServlet
ingresa y destruye el FacesServlet
service()
antes de FacesServlet
el método service()
. Por lo tanto, solo hay una instancia por solicitud (y, por lo tanto, no por solicitud). Tenga en cuenta que una solicitud HTTP cuenta como una cadena separada. Puede haber múltiples hilos (leer: solicitudes) y, por lo tanto, puede haber múltiples instancias de FacesContext
durante la vida de la aplicación. Su patrón principal es el patrón de fachada , pero eso además no está relacionado con que sea un ThreadLocal
.
Ver también:
Mientras FacesContext
el javadoc de FacesContext
, me encontré con esta frase
La instancia permanece activa hasta que se invoca su método de liberación (), después de lo cual no se permiten más referencias a esta instancia. Mientras una instancia de FacesContext está activa, no se debe hacer referencia a ella desde ningún hilo que no sea el sobre el que se utiliza el contenedor de servlets que ejecuta esta aplicación web para el procesamiento de esta solicitud.
¿Esto significa que FacesContext
nunca irá a la recolección de basura, y la instancia se destruirá solo cuando la aplicación weba actual se detenga (el servidor está detenido)?
¿ FacesContext
sigue el patrón singleton? En ese caso, ¿cómo se comportará cuando se solicite de manera múltiple y se presente simultáneamente la respuesta de renderizado, ya que solo atiende una solicitud por vez?