Lazy Initialization in Spring Boot 2

1. Oversigt

I denne vejledning vil vi se, hvordan man konfigurerer doven initialisering på applikationsniveau startende med Spring Boot 2.2

2. Lazy initialisering

Som standard om foråret oprettes alle de definerede bønner og deres afhængigheder, når applikationskonteksten oprettes.

I modsætning hertil, når vi konfigurerer en bønne med doven initialisering, bønnen oprettes kun, og dens afhængighed injiceres, når de er nødvendige.

3. Maven-afhængigheden

For at få Spring Boot 2.2 i vores applikation skal vi medtage den i vores klassesti.

Med Maven kan vi bare tilføje spring-boot-starter afhængighed:

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

4. Aktivér Lazy Initialization

Spring Boot 2.2 introducerer spring.main.lazy-initialisering egenskab, hvilket gør det lettere at konfigurere doven initialisering på tværs af hele applikationen.

Indstilling af ejendomsværdien til rigtigt betyder, at alle bønner i applikationen bruger doven initialisering.

Lad os konfigurere ejendommen i vores ansøgning.yml konfigurationsfil:

forår: hoved: doven initialisering: sandt

Eller hvis det er tilfældet, i vores application.properties fil:

spring.main.lazy-initialization = true

Denne konfiguration påvirker alle bønner i sammenhængen. Så hvis vi vil konfigurere doven initialisering til en bestemt bønne, kan vi gøre det gennem @Doven nærme sig.

Endnu mere kan vi bruge den nye ejendom i kombination med @Doven kommentar, indstillet til falsk.

Eller med andre ord, alle de definerede bønner bruger doven initialisering, undtagen dem, som vi udtrykkeligt konfigurerer med @Lazy (falsk).

5. Kør

Lad os oprette en simpel tjeneste, der gør det muligt for os at teste det, vi lige har beskrevet.

Ved at tilføje en besked til konstruktøren ved vi nøjagtigt, hvornår bønnen bliver oprettet.

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

Lad os også oprette SpringApplication og indsprøjt den service, vi har oprettet før.

@SpringBootApplication public class Application {@Bean ("writer1") public Writer getWriter1 () {returner ny Writer ("Writer 1"); } @Bean ("writer2") public Writer getWriter2 () {returner ny Writer ("Writer 2"); } offentlig statisk ugyldig hoved (String [] args) {ApplicationContext ctx = SpringApplication.run (Application.class, args); System.out.println ("Application context initialised !!!"); Writer writer1 = ctx.getBean ("writer1", Writer.class); writer1.write ("Første besked"); Writer writer2 = ctx.getBean ("writer2", Writer.class); writer2.write ("Anden besked"); }}

Lad os indstille spring.main.lazy-initialisering ejendomsværdi til falsk, og kør vores applikation.

Forfatter 1 initialiseret !!! Forfatter 2 initialiseret !!! Applikationskontekst initialiseret !!! Forfatter 1: Første besked Forfatter 2: Anden besked

Som vi kan se, blev bønnerne oprettet, da applikationskonteksten startede.

Lad os nu ændre værdien af spring.main.lazy-initialisering til rigtigt, og kør vores ansøgning igen.

Applikationskontekst initialiseret !!! Forfatter 1 initialiseret !!! Writer 1: Første besked Writer 2 initialiseret !!! Forfatter 2: Anden besked

Som et resultat oprettede applikationen ikke bønnerne ved opstartstidspunktet, men kun når det var nødvendigt.

6. Effekter af doven initialisering

Aktivering af doven initialisering i hele applikationen kan give både positive og negative effekter.

Lad os tale om nogle af disse, som de er beskrevet i den officielle meddelelse om den nye funktionalitet:

  1. Lazy initialisering kan reducere antallet af bønner, der oprettes, når applikationen starter - derfor vi kan forbedre opstartstiden af ansøgningen
  2. Da ingen af ​​bønnerne oprettes, før de er nødvendige, vi kunne maskere problemer og få dem i løbetid i stedet for opstartstid
  3. Problemerne kan omfatte hukommelsesfejl, fejlkonfigurationer eller klassedefinerede fejl
  4. Også når vi er i en webkontekst, udløsning af bønneskabelse efter behov øger latenstiden for HTTP-anmodninger - oprettelse af bønner påvirker kun den første anmodning, men dette kan have en negativ indvirkning på belastningsbalancering og automatisk skalering.

7. Konklusion

I denne vejledning konfigurerede vi doven initialisering med den nye egenskab spring.main.lazy-initialisering, introduceret i Spring Boot 2.2.

Som altid er kildekoden til denne tutorial tilgængelig på GitHub.