¿Qué es?
Es una anotación de Spring que nos permite posponer la creación de beans, de tal forma que éstos sólo se crearán cuando se vayan a utilizar, en lugar de crearlos al iniciar la aplicación.
Ésto nos puede servir en aplicaciones que tienen funcionalidades muy grandes y tardan en cargar y así optimizar el tiempo de arranque y el uso inicial de recursos.
¿Cómo funciona?
Por defecto, Spring crea los beans cuando se inicializa la aplicación, independientemente de si se van a utilizar o no. Esto se llama eager loading y hace que se reserven recursos para estos componentes.
Cuando se aplica la anotación @Lazy, el bean no se crea durante el inicio del aplicativo, sino cuando se va a invocar por primera vez. Este comportamiento se conoce como lazy loading.
Ejemplo:
Supongamos que tenemos un componente que requiere de muchos recursos y/o necesita mucho tiempo para inicializarse y no siempre es necesario instanciarlo porque no se utiliza de forma habitual.
Como no queremos que se instancie durante el arranque de la aplicación, la anotamos con la anotación @Lazy.
En este ejemplo, el bean HeavyService no se creará durante el arranque de la aplicación, sino solo cuando se invoque por primera vez:
También en la clase que tenga como dependencia el componente, habrá que ponerle la anotacion @Lazy cuando se inyecte la dependencia.
Si el método useHeavyService de la clase MyComponent no es llamado, el servicio HeavyService nunca se creará.
Uso a nivel de clase y a nivel de método
La anotación @Lazy se puede utilizar a dos niveles.
- A nivel de clase: Si se aplica a una clase (como en el ejemplo anterior), esa clase solo se instanciará cuando sea necesario.
A nivel de método: También se puede aplicar a métodos de configuración en clases anotadas con @Configuration para que los beans definidos en esos métodos se creen solo cuando se soliciten:
Consideraciones
- Componentes críticos: No es recomendable usar esta anotación en beans que son críticos para el funcionamiento de la aplicación o que tienen que estar cargados inmediatamente al inicio de la aplicación.
- Dependencias cíclicas: Posponer la carga de los beans puede dificultar la resolución de dependencias cíclicas, al no verse en el arranque de la aplicación.
Conclusión
En este artículo hemos visto qué es y cómo funciona la anotación @Lazy en Spring, así como las consideraciones a tener en cuenta al usarla.
Dejamos un pequeño proyecto implementando el uso de esta anotación en nuestro repositorio de GitLab.