1. Información general
De forma predeterminada, Spring crea todos los beans singleton con entusiasmo en el inicio / arranque del contexto de la aplicación. La razón detrás de esto es simple: para evitar y detectar todos los posibles errores inmediatamente en lugar de en tiempo de ejecución.
Sin embargo, hay casos en los que necesitamos crear un bean, no al inicio del contexto de la aplicación, sino cuando lo solicitamos.
En este tutorial rápido, vamos a discutir la anotación @Lazy de Spring .
2. Inicialización diferida
La anotación @Lazy ha estado presente desde la versión 3.0 de Spring. Hay varias formas de decirle al contenedor de IoC que inicialice un bean de forma perezosa.
2.1. @Configuration Class
Cuando colocamos la anotación @Lazy sobre la clase @Configuration , indica que todos los métodos con la anotación @Bean deben cargarse de forma perezosa .
Este es el equivalente para el atributo default-lazy-init = "true " de la configuración basada en XML .
Echemos un vistazo aquí:
@Lazy @Configuration @ComponentScan(basePackages = "com.baeldung.lazy") public class AppConfig { @Bean public Region getRegion(){ return new Region(); } @Bean public Country getCountry(){ return new Country(); } }
Probemos ahora la funcionalidad:
@Test public void givenLazyAnnotation_whenConfigClass_thenLazyAll() { AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); ctx.register(AppConfig.class); ctx.refresh(); ctx.getBean(Region.class); ctx.getBean(Country.class); }
Como vemos, todos los beans se crean solo cuando los solicitamos por primera vez:
Bean factory for ...AnnotationConfigApplicationContext: ...DefaultListableBeanFactory: [...]; // application context started Region bean initialized Country bean initialized
Para aplicar esto solo a un bean específico, eliminemos @Lazy de una clase.
Luego lo agregamos a la configuración del bean deseado:
@Bean @Lazy(true) public Region getRegion(){ return new Region(); }
2.2 Con @Autowired
Antes de continuar, consulte estas guías para las anotaciones @Autowired y @Component .
Aquí, para inicializar un bean perezoso, lo referenciamos desde otro.
El bean que queremos cargar perezosamente:
@Lazy @Component public class City { public City() { System.out.println("City bean initialized"); } }
Y es referencia:
public class Region { @Lazy @Autowired private City city; public Region() { System.out.println("Region bean initialized"); } public City getCityInstance() { return city; } }
Tenga en cuenta que @Lazy es obligatorio en ambos lugares.
Con la anotación @Component en la clase City y mientras se hace referencia a ella con @Autowired:
@Test public void givenLazyAnnotation_whenAutowire_thenLazyBean() { // load up ctx appication context Region region = ctx.getBean(Region.class); region.getCityInstance(); }
Aquí, el bean City se inicializa solo cuando llamamos al método getCityInstance () .
3. Conclusión
En este tutorial rápido, aprendimos los conceptos básicos de la anotación @Lazy de Spring . Examinamos varias formas de configurarlo y usarlo.
Como de costumbre, el código completo de esta guía está disponible en GitHub.