Anotación @Lazy

¿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.

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.

Anotación @Lazy cuando se inyecta la dependencia.

Si el método useHeavyService de la clase MyComponent no es llamado, el servicio HeavyService nunca se creará.

useHeavyService en @Lazy

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:

La anotación @Lazy se puede utilizar a dos niveles.

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.

<span style="font-size:80%">Autor </span><a href="https://blog.kairosds.com/author/andresgonzalez/" target="_self">Andrés González</a>

Autor Andrés González

Nov 4, 2024

Otros artículos