Lazy Initialization in Spring Boot 2

1. Prehľad

V tomto tutoriáli sa dozvieme, ako nakonfigurovať lenivú inicializáciu na úrovni aplikácie, počnúc Spring Boot 2.2

2. Lenivá inicializácia

Štandardne na jar sa všetky definované fazule a ich závislosti vytvárajú pri vytváraní kontextu aplikácie.

Naopak, keď konfigurujeme fazuľu s lenivou inicializáciou, fazuľa sa vytvorí a jej závislosti sa vstreknú, až keď to bude potrebné.

3. Závislosť Maven

Aby sme mohli Spring Boot 2.2 dostať do našej aplikácie, musíme ju zahrnúť do našej triedy.

S Mavenom môžeme len pridať štartér s pružinou závislosť:

  org.springframework.boot Spring-Boot-Starter 2.2.2. UVOĽNENIE 

4. Povoľte lenivú inicializáciu

Spring Boot 2.2 predstavuje jar.main.lazy-inicializácia vlastnosť, čo uľahčuje konfiguráciu lenivej inicializácie v celej aplikácii.

Nastavenie hodnoty vlastnosti na pravda znamená, že všetky fazule v aplikácii budú používať lenivú inicializáciu.

Poďme nakonfigurovať vlastnosť v našom aplikácia.yml konfiguračný súbor:

pružina: hlavná: lenivá-inicializácia: pravda

Alebo, ak je to tak, v našom application.properties spis:

spring.main.lazy-initialization = true

Táto konfigurácia ovplyvňuje všetky fazule v danom kontexte. Pokiaľ teda chceme nakonfigurovať lenivú inicializáciu pre konkrétnu fazuľu, môžeme to urobiť cez @Lazy prístup.

Ešte viac môžeme novú nehnuteľnosť používať v kombinácii s @Lazy anotácia, nastavená na nepravdivé.

Alebo inými slovami, všetky definované fazule budú používať lenivú inicializáciu, okrem tých, s ktorými explicitne konfigurujeme @Lazy (nepravda).

5. Spustiť

Vytvorme si jednoduchú službu, ktorá nám umožní otestovať to, čo sme práve opísali.

Po pridaní správy do konštruktora budeme presne vedieť, kedy sa fazuľa vytvorí.

public class Writer {súkromné ​​finále String writerId; public Writer (String writerId) {this.writerId = writerId; System.out.println (writerId + "inicializovaný !!!"); } public void write (String message) {System.out.println (writerId + ":" + správa); }}

Vytvorme tiež SpringApplication a vložiť službu, ktorú sme vytvorili predtým.

@SpringBootApplication verejná trieda Aplikácia {@Bean ("writer1") verejný Writer getWriter1 () {vrátiť nový Writer ("Writer 1"); } @Bean ("writer2") public Writer getWriter2 () {vrátiť nový Writer ("Writer 2"); } public static void main (String [] args) {ApplicationContext ctx = SpringApplication.run (Application.class, args); System.out.println ("Inicializovaný kontext aplikácie !!!"); Writer writer1 = ctx.getBean ("writer1", Writer.class); writer1.write ("Prvá správa"); Writer writer2 = ctx.getBean ("writer2", Writer.class); writer2.write ("Druhá správa"); }}

Poďme nastaviť jar.main.lazy-inicializácia hodnota majetku do nepravdivéa spustite našu aplikáciu.

Spisovateľ 1 inicializovaný !!! Spisovateľ 2 inicializovaný !!! Inicializovaný kontext aplikácie !!! Pisateľ 1: Prvá správa Pisateľ 2: Druhá správa

Ako vidíme, fazuľa bola vytvorená pri spustení kontextu aplikácie.

Teraz zmeňme hodnotu jar.main.lazy-inicializácia do pravdaa znova spustite našu aplikáciu.

Inicializovaný kontext aplikácie !!! Spisovateľ 1 inicializovaný !!! Autor 1: Prvá správa Program 2 bol inicializovaný !!! Autor 2: Druhá správa

Výsledkom bolo, že aplikácia nevytvorila fazuľa v čase spustenia, ale až keď ich potrebovala.

6. Účinky lenivej inicializácie

Povolenie lenivej inicializácie v celej aplikácii by mohlo mať pozitívne aj negatívne účinky.

Poďme si povedať o niektorých z nich, ktoré sú opísané v oficiálnom oznámení o novej funkcii:

  1. Lenivá inicializácia môže znížiť počet fazúľ vytvorených pri spustení aplikácie - preto môžeme zlepšiť čas spustenia žiadosti
  2. Pretože žiadna z fazúľ nie je vytvorená, kým nie sú potrebné, mohli by sme zamaskovať problémy a dostať ich do doby behu namiesto času spustenia
  3. Medzi tieto problémy môžu patriť chyby pamäte, nesprávne konfigurácie alebo chyby nájdené v definícii triedy
  4. Keď sme navyše vo webovom kontexte, spustenie vytvárania fazule na požiadanie zvýši latenciu požiadaviek HTTP - vytvorenie fazule ovplyvní iba prvú požiadavku, ale - to môže mať negatívny dopad na vyvažovanie záťaže a automatické škálovanie.

7. Záver

V tomto tutoriáli sme nakonfigurovali lenivú inicializáciu s novou vlastnosťou spring.main.lazy-initialization, predstavené v Spring Boot 2.2.

Ako vždy, zdrojový kód tohto tutoriálu je k dispozícii na GitHub.