Performance: Porqué usar @Factory en vez de getters

Cuando JSF resuelve una #{EL Expression} no cachea los resultados. Esto quiere decir que por cada expresión como #{user.name}, se hará una llamada al método User.getName().

Esto por sí mismo no es peligroso. Pero analicemos este caso típico

@Name("userManager")
public class UserManager {

    public List getUserList() {
        return createUserList();
    }
}

<h :dataTable value="#{userManager.userList}" var="user">
    ...
    #{user.name}
    ...
</h>

En este caso por cada fila de la tabla, se hará una llamada al método UserManager.getUserList() para obtener el usuario actual. Si el método UserManager.getUserList() implica una llamada a la base de datos, el tiempo de carga crece imcreíblemente.

Una primera solución es usar el patrón de diseño Carga Perezosa (LazyLoad).

@Name("userManager")
public class UserManager {
    private List list;

    public List getUserList() {
        if (this.list == null) {
            this.list = createUserList();
        }
        return list;
    }
}

De esta forma la lista no se crea cada vez que se la llama desde la página JSF. Pero aún así se sigue invocando el método getUserList() multitud de veces.

La mejor solución es poner la lista en el contexto de la página, y acceder a ella directamente por su nombre en el contexto en vez de por el componente al que pertenece.
Esto se puede hacer mediante la anotación @Out o la anotación @Factory

public class UserManager {

    @Factory(value = "userList", scope = ScopeType.PAGE)
    public List getUserList() {
        if (this.list == null) {
            this.list = createUserList();
        }
        return list;
    }
}

<h :dataTable value="#{userList}" var="user"> // invocamos la variable userList directamente
    ...
    #{user.name}
    ...
</h>

Leave a Comment

Cómo obtener un componente de seam sin usar la anotacion @In

Leave a Comment

Cambiar el usuario y password de subversion en eclipse

Leave a Comment

Eventos en Seam

Leave a Comment

SEO-friendly URLs con Seam II

Leave a Comment

SEO-friendly URLs con Seam

Leave a Comment

Marcas de Google Maps con menu contextual

Leave a Comment

Marcas de Google Maps con tooltip personalizado

Leave a Comment

Cómo limitar el zoom y el desplazamiento en Google Maps

Leave a Comment

Arrays asociativos en javacript

Leave a Comment