Luie initialisatie in Spring Boot 2

1. Overzicht

In deze tutorial zullen we zien hoe je luie initialisatie configureert op applicatieniveau, te beginnen met Spring Boot 2.2

2. Luie initialisatie

Standaard worden in Spring alle gedefinieerde bonen en hun afhankelijkheden gemaakt wanneer de toepassingscontext wordt gemaakt.

Als we daarentegen een bean configureren met luie initialisatie, de boon wordt pas gemaakt en de afhankelijkheden worden geïnjecteerd als ze nodig zijn.

3. De afhankelijkheid van Maven

Om Spring Boot 2.2 in onze applicatie te krijgen, moeten we het opnemen in ons klassenpad.

Met Maven kunnen we gewoon de spring-boot-starter afhankelijkheid:

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

4. Schakel Luie initialisatie in

Spring Boot 2.2 introduceert de spring.main.lazy-initialisatie eigenschap, waardoor het eenvoudiger wordt om luie initialisatie in de hele applicatie te configureren.

De eigenschapswaarde instellen op waar betekent dat alle bonen in de applicatie luie initialisatie zullen gebruiken.

Laten we de eigenschap configureren in ons application.yml configuratiebestand:

spring: main: lazy-initialization: true

Of, als dat het geval is, in onze application.properties het dossier:

spring.main.lazy-initialization = true

Deze configuratie is van invloed op alle bonen in de context. Dus als we luie initialisatie voor een specifieke bean willen configureren, kunnen we dit doen via de @Lui nadering.

Sterker nog, we kunnen gebruik maken van het nieuwe pand, in combinatie met de @Lui annotatie, ingesteld op false.

Of met andere woorden, alle gedefinieerde bonen zullen luie initialisatie gebruiken, behalve degene waarmee we expliciet configureren @Lazy (false).

5. Rennen

Laten we een eenvoudige service maken waarmee we kunnen testen wat we zojuist hebben beschreven.

Door een bericht aan de constructor toe te voegen, weten we precies wanneer de boon wordt gemaakt.

public class Writer {private final String writerId; openbare Writer (String writerId) {this.writerId = writerId; System.out.println (writerId + "geïnitialiseerd !!!"); } public void write (String bericht) {System.out.println (writerId + ":" + bericht); }}

Laten we ook het SpringApplication en injecteer de service die we eerder hebben gemaakt.

@SpringBootApplication openbare klasse Toepassing {@Bean ("writer1") openbare schrijver getWriter1 () {retourneer nieuwe schrijver ("Writer 1"); } @Bean ("writer2") public Writer getWriter2 () {retourneer nieuwe Writer ("Writer 2"); } public static void main (String [] args) {ApplicationContext ctx = SpringApplication.run (Application.class, args); System.out.println ("Applicatiecontext geïnitialiseerd !!!"); Writer writer1 = ctx.getBean ("writer1", Writer.class); writer1.write ("Eerste bericht"); Writer writer2 = ctx.getBean ("writer2", Writer.class); writer2.write ("Tweede bericht"); }}

Laten we de spring.main.lazy-initialisatie eigendomswaarde naar false, en voer onze applicatie uit.

Schrijver 1 geïnitialiseerd !!! Writer 2 geïnitialiseerd !!! Applicatiecontext geïnitialiseerd !!! Schrijver 1: Eerste bericht Schrijver 2: Tweede bericht

Zoals we kunnen zien, zijn de bonen gemaakt tijdens het opstarten van de toepassingscontext.

Laten we nu de waarde van spring.main.lazy-initialisatie naar waar, en voer onze applicatie opnieuw uit.

Applicatiecontext geïnitialiseerd !!! Schrijver 1 geïnitialiseerd !!! Schrijver 1: Eerste bericht Schrijver 2 geïnitialiseerd !!! Schrijver 2: Tweede bericht

Als gevolg hiervan heeft de toepassing de bonen niet tijdens het opstarten gemaakt, maar alleen wanneer deze ze nodig had.

6. Effecten van luie initialisatie

Het inschakelen van luie initialisatie in de hele applicatie kan zowel positieve als negatieve effecten hebben.

Laten we het hebben over enkele hiervan, zoals ze worden beschreven in de officiële aankondiging van de nieuwe functionaliteit:

  1. Luie initialisatie kan het aantal bonen dat wordt gemaakt bij het starten van de toepassing verminderen - daarom, we kunnen de opstarttijd verbeteren van de aanvraag
  2. Omdat er geen bonen worden gemaakt totdat ze nodig zijn, we zouden problemen kunnen maskeren door ze in runtime te krijgen in plaats van opstarttijd
  3. De problemen kunnen bestaan ​​uit geheugenfouten, verkeerde configuraties of class-definition-found-fouten
  4. Als we ons in een webcontext bevinden, het op verzoek activeren van bean-creatie zal de latentie van HTTP-verzoeken verhogen - het maken van bonen heeft alleen invloed op het eerste verzoek, maar dit kan een negatieve invloed hebben op load-balancing en auto-scaling.

7. Conclusie

In deze tutorial hebben we luie initialisatie geconfigureerd met de nieuwe eigenschap spring.main.lazy-initialisatie, geïntroduceerd in Spring Boot 2.2.

Zoals altijd is de broncode voor deze tutorial beschikbaar op GitHub.


$config[zx-auto] not found$config[zx-overlay] not found