Lijena inicijalizacija u proljetnom pokretanju 2

1. Pregled

U ovom uputstvu vidjet ćemo kako konfigurirati lijenu inicijalizaciju na razini aplikacije, počevši od Spring Boot 2.2

2. Lijena inicijalizacija

Prema zadanim postavkama u proljeće, svi definirani grahovi i njihove ovisnosti kreiraju se kada se kreira kontekst aplikacije.

Suprotno tome, kada konfiguriramo grah s lijenom inicijalizacijom, grah će se stvoriti i ubrizgati njegove ovisnosti kad jednom zatreba.

3. Ovisnost Mavena

Da bismo u našu aplikaciju dobili Spring Boot 2.2, moramo ga uključiti u svoju stazu predavanja.

S Mavenom možemo samo dodati opruga-čizma-starter ovisnost:

  org.springframework.boot spring-boot-starter 2.2.2.OSLOBOĐENJE 

4. Omogućite lijenu inicijalizaciju

Spring Boot 2.2 predstavlja proljeće.glavno.laza-inicijalizacija svojstvo, što olakšava konfiguriranje lijene inicijalizacije u cijeloj aplikaciji.

Postavljanje vrijednosti svojstva na pravi znači da će svi grah u aplikaciji koristiti lijenu inicijalizaciju.

Konfigurirajmo svojstvo u našem primjena.iml konfiguracijska datoteka:

proljeće: glavno: lijena-inicijalizacija: istina

Ili, ako je to slučaj, u našem primjena.svojstva datoteka:

spring.main.lazy-initialization = true

Ova konfiguracija utječe na sve grah u kontekstu. Dakle, ako želimo konfigurirati lijenu inicijalizaciju za određeni grah, to možemo učiniti putem @Lijen pristup.

Čak što više, možemo koristiti novo svojstvo, u kombinaciji s @Lijen napomena, postavljeno na lažno.

Ili drugim riječima, svi definirani grahovi koristit će lijenu inicijalizaciju, osim onih s kojima se izričito konfiguriramo @Lijeno (lažno).

5. Trči

Stvorimo jednostavnu uslugu koja će nam omogućiti da testiramo ono što smo upravo opisali.

Dodavanjem poruke u konstruktor, znat ćemo točno kada se grah stvara.

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

Također, kreirajmo SpringApplication i ubrizgavamo uslugu koju smo prije stvorili.

@SpringBootApplication javna klasa Application {@Bean ("writer1") public Writer getWriter1 () {return new Writer ("Writer 1"); } @Bean ("writer2") public Writer getWriter2 () {return new Writer ("Writer 2"); } javna statička void glavna (String [] args) {ApplicationContext ctx = SpringApplication.run (Application.class, args); System.out.println ("Inicijaliziran kontekst aplikacije !!!"); Writer Writer1 = ctx.getBean ("Writer1", Writer.class); writer1.write ("Prva poruka"); Writer Writer2 = ctx.getBean ("Writer2", Writer.class); writer2.write ("Druga poruka"); }}

Postavimo proljeće.glavno.laza-inicijalizacija vrijednost imovine do lažnoi pokrenite našu aplikaciju.

Writer 1 inicijaliziran !!! Writer 2 inicijaliziran !!! Inicijaliziran kontekst aplikacije !!! Writer 1: Prva poruka Writer 2: Druga poruka

Kao što vidimo, grah je stvoren kad se kontekst aplikacije pokrenuo.

Promijenimo sada vrijednost od proljeće.glavno.laza-inicijalizacija do pravii ponovno pokrenite našu aplikaciju.

Inicijaliziran kontekst aplikacije !!! Writer 1 inicijaliziran !!! Writer 1: Prva poruka Writer 2 inicijalizirana !!! Writer 2: Druga poruka

Kao rezultat toga, aplikacija nije stvorila grah u vrijeme pokretanja, već samo kada je trebala.

6. Učinci lijene inicijalizacije

Omogućavanje lijene inicijalizacije u cijeloj aplikaciji moglo bi proizvesti i pozitivne i negativne učinke.

Razgovarajmo o nekima od njih, kako su opisani u službenoj najavi nove funkcionalnosti:

  1. Lijena inicijalizacija može smanjiti broj graha stvorenih kad se aplikacija pokreće - dakle, možemo poboljšati vrijeme pokretanja prijave
  2. Kako se niti jedan grah ne stvara dok nije potreban, mogli bismo prikriti probleme, uzimajući ih u vrijeme izvođenja umjesto vremena pokretanja
  3. Problemi mogu obuhvaćati pogreške izvan memorije, pogrešne konfiguracije ili pogreške pronađene u definiciji klase
  4. Također, kada smo u web kontekstu, pokretanje stvaranja graha na zahtjev povećat će kašnjenje HTTP zahtjeva - stvaranje graha utjecati će samo na prvi zahtjev, ali to može imati negativan utjecaj na uravnoteženje opterećenja i automatsko skaliranje.

7. Zaključak

U ovom smo uputstvu konfigurirali lijenu inicijalizaciju s novim svojstvom spring.main.lazy-inicijalizacija, predstavljen u Spring Boot 2.2.

Kao i uvijek, izvorni kod za ovu lekciju dostupan je na GitHubu.