Inizializzazione pigra in Spring Boot 2

1. Panoramica

In questo tutorial vedremo come configurare l'inizializzazione pigra a livello di applicazione, a partire da Spring Boot 2.2

2. Inizializzazione pigra

Per impostazione predefinita in Spring, tutti i bean definiti e le loro dipendenze vengono creati quando viene creato il contesto dell'applicazione.

Al contrario, quando configuriamo un bean con inizializzazione pigra, il bean verrà creato e le sue dipendenze iniettate solo quando saranno necessarie.

3. La dipendenza da Maven

Per ottenere Spring Boot 2.2 nella nostra applicazione, dobbiamo includerlo nel nostro classpath.

Con Maven, possiamo semplicemente aggiungere la dipendenza spring-boot-starter :

  org.springframework.boot spring-boot-starter 2.2.2.RELEASE   

4. Abilitare l'inizializzazione lenta

Spring Boot 2.2 introduce la proprietà spring.main.lazy-initialization , che semplifica la configurazione dell'inizializzazione lazy nell'intera applicazione.

L'impostazione del valore della proprietà su true significa che tutti i bean nell'applicazione utilizzeranno l'inizializzazione lenta.

Configuriamo la proprietà nel nostro file di configurazione application.yml :

spring: main: lazy-initialization: true

Oppure, se è il caso, nel nostro file application.properties :

spring.main.lazy-initialization=true

Questa configurazione influisce su tutti i bean nel contesto. Quindi, se vogliamo configurare l'inizializzazione pigra per un bean specifico, possiamo farlo attraverso l' approccio @Lazy .

Inoltre , possiamo usare la nuova proprietà, in combinazione con l' annotazione @Lazy , impostata su false .

O in altre parole, tutti i bean definiti useranno l'inizializzazione pigra, ad eccezione di quelli che configuriamo esplicitamente con @Lazy (false) .

5. Esegui

Creiamo un semplice servizio che ci permetterà di testare quanto appena descritto.

Aggiungendo un messaggio al costruttore, sapremo esattamente quando viene creato il bean.

public class Writer { private final String writerId; public Writer(String writerId) { this.writerId = writerId; System.out.println(writerId + " initialized!!!"); } public void write(String message) { System.out.println(writerId + ": " + message); } }

Inoltre, creiamo la SpringApplication e inseriamo il servizio che abbiamo creato prima.

@SpringBootApplication public class Application { @Bean("writer1") public Writer getWriter1() { return new Writer("Writer 1"); } @Bean("writer2") public Writer getWriter2() { return new Writer("Writer 2"); } public static void main(String[] args) { ApplicationContext ctx = SpringApplication.run(Application.class, args); System.out.println("Application context initialized!!!"); Writer writer1 = ctx.getBean("writer1", Writer.class); writer1.write("First message"); Writer writer2 = ctx.getBean("writer2", Writer.class); writer2.write("Second message"); } }

Impostiamo il valore della proprietà spring.main.lazy-initialization su false ed eseguiamo la nostra applicazione.

Writer 1 initialized!!! Writer 2 initialized!!! Application context initialized!!! Writer 1: First message Writer 2: Second message

Come possiamo vedere, i bean sono stati creati all'avvio del contesto dell'applicazione.

Ora cambiamo il valore di spring.main.lazy-initialization in true ed eseguiamo nuovamente la nostra applicazione.

Application context initialized!!! Writer 1 initialized!!! Writer 1: First message Writer 2 initialized!!! Writer 2: Second message

Di conseguenza, l'applicazione non ha creato i bean all'avvio, ma solo quando ne aveva bisogno.

6. Effetti dell'inizializzazione pigra

Abilitare l'inizializzazione lenta nell'intera applicazione potrebbe produrre effetti sia positivi che negativi.

Parliamo di alcuni di questi, così come sono descritti nell'annuncio ufficiale della nuova funzionalità:

  1. L'inizializzazione lenta può ridurre il numero di bean creati all'avvio dell'applicazione, quindi possiamo migliorare il tempo di avvio dell'applicazione
  2. Poiché nessuno dei bean viene creato fino a quando non è necessario, è possibile mascherare i problemi, portandoli in fase di esecuzione anziché in fase di avvio
  3. I problemi possono includere errori di memoria insufficiente, configurazioni errate o errori trovati nella definizione della classe
  4. Inoltre, quando ci troviamo in un contesto web, l' attivazione della creazione del bean su richiesta aumenterà la latenza delle richieste HTTP : la creazione del bean influenzerà solo la prima richiesta, ma ciò potrebbe avere un impatto negativo sul bilanciamento del carico e sulla scalabilità automatica .

7. Conclusione

In questo tutorial, abbiamo configurato l'inizializzazione pigra con la nuova proprietà spring.main.lazy-initialization, introdotta in Spring Boot 2.2.

Come sempre, il codice sorgente di questo tutorial è disponibile su GitHub.