En este post me gustaría hacer una pequeña contribución al post “Performance: ¿Por qué usar @Factory en vez de getters?” de Seam City sobre el uso de @Factory para la obtención de listas.
En el post se menciona que los valores obtenidos por EL no se guardan en cache y ésto es un problema sobre todo cuando se acceden a listas que son cargadas desde la base de datos.
Para resolver el problema el post plantea 2 opciones:
Por patrón de carga lazy loading
@Name("userManager") public class UserManager { private List list; public List getUserList() { if (this.list == null) { this.list = createUserList(); } return list; } }
Y una mejor manera utilizando las anotaciones @Out y @Factory
public class UserManager { @Factory(value = "userList", scope = ScopeType.PAGE) public List getUserList() { if (this.list == null) { this.list = createUserList(); } return list; } }
Sin embargo existe una tercera solución que es bastante más clara y sobre todo sigue la convención con respecto a la creación de objetos y es utilizar la anotación @Create
El código es el siguiente:
@Name("userManager") @Scope(ScopeType.PAGE) public class UserManager implements Serializable { private List<User> list; @Create public void loadInitData() { this.list = createList(); } public List<User> getList() { return list; } public void setList(List<User> list) { this.list = list; } }
La anotación @Create nos permite declarar que un método se ejecute al momento que un componente es creado. Momento apropiado para cargar toda la información que sólo debe ser obtenida una vez.
La anotación @Scope(ScopeType.PAGE) nos permite establecer un contexto para el componente de seam, en este caso que el componente exista mientras la página esta activa. Se pueden utilizar otros contextos como por ejemplo Conversation o Session, sin embargo no es recomendable usar el contexto session a menos que sea estrictamente necesario pues sin una adecuada adminstración la memoria requerida por aplicación puede dispararse.
A modo de conclusión
Es una buena práctica centralizar la información de carga estática en un solo método y combinado con el scope Page mejor, pues el uso de memoria en el servidor es mínimo.
No related posts.
