Una guida rapida all'annotazione Spring @Lazy

1. Panoramica

Per impostazione predefinita, Spring crea tutti i bean singleton all'avvio / bootstrap del contesto dell'applicazione. Il motivo è semplice: evitare e rilevare tutti i possibili errori immediatamente piuttosto che in fase di esecuzione.

Tuttavia, ci sono casi in cui abbiamo bisogno di creare un bean, non all'avvio del contesto dell'applicazione, ma quando lo richiediamo.

In questo breve tutorial, discuteremo dell'annotazione @Lazy di Spring .

2. Inizializzazione pigra

L' annotazione @Lazy è presente dalla versione Spring 3.0. Esistono diversi modi per dire al contenitore IoC di inizializzare un bean in modo pigro.

2.1. @Configuration Class

Quando inseriamo l' annotazione @Lazy sulla classe @Configuration , indica che tutti i metodi con l' annotazione @Bean devono essere caricati in modo pigro .

Questo è l'equivalente dell'attributo default-lazy-init = "true " della configurazione basata su XML .

Diamo uno sguardo qui:

@Lazy @Configuration @ComponentScan(basePackages = "com.baeldung.lazy") public class AppConfig { @Bean public Region getRegion(){ return new Region(); } @Bean public Country getCountry(){ return new Country(); } }

Proviamo ora la funzionalità:

@Test public void givenLazyAnnotation_whenConfigClass_thenLazyAll() { AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); ctx.register(AppConfig.class); ctx.refresh(); ctx.getBean(Region.class); ctx.getBean(Country.class); }

Come si vede, tutti i bean vengono creati solo quando li richiediamo per la prima volta:

Bean factory for ...AnnotationConfigApplicationContext: ...DefaultListableBeanFactory: [...]; // application context started Region bean initialized Country bean initialized

Per applicarlo solo a un bean specifico, rimuoviamo @Lazy da una classe.

Quindi lo aggiungiamo alla configurazione del bean desiderato:

@Bean @Lazy(true) public Region getRegion(){ return new Region(); }

2.2 Con @Autowired

Prima di procedere, consulta queste guide per le annotazioni @Autowired e @Component .

Qui, per inizializzare un lazy bean, lo facciamo riferimento da un altro.

Il fagiolo che vogliamo caricare pigramente:

@Lazy @Component public class City { public City() { System.out.println("City bean initialized"); } }

Ed è riferimento:

public class Region { @Lazy @Autowired private City city; public Region() { System.out.println("Region bean initialized"); } public City getCityInstance() { return city; } }

Nota che @Lazy è obbligatorio in entrambi i posti.

Con l' annotazione @Component sulla classe City e mentre vi si fa riferimento con @Autowired:

@Test public void givenLazyAnnotation_whenAutowire_thenLazyBean() { // load up ctx appication context Region region = ctx.getBean(Region.class); region.getCityInstance(); }

Qui, il bean City viene inizializzato solo quando chiamiamo il metodo getCityInstance () .

3. Conclusione

In questo breve tutorial, abbiamo imparato le basi dell'annotazione @Lazy di Spring . Abbiamo esaminato diversi modi per configurarlo e utilizzarlo.

Come al solito, il codice completo di questa guida è disponibile su GitHub.