Lazy Initialization in Spring Boot 2

1. Übersicht

In diesem Tutorial erfahren Sie, wie Sie die verzögerte Initialisierung auf Anwendungsebene konfigurieren, beginnend mit Spring Boot 2.2

2. Lazy Initialization

Standardmäßig werden in Spring alle definierten Beans und ihre Abhängigkeiten erstellt, wenn der Anwendungskontext erstellt wird.

Wenn wir dagegen eine Bean mit verzögerter Initialisierung konfigurieren, wird die Bean erst erstellt und ihre Abhängigkeiten werden eingefügt, sobald sie benötigt werden.

3. Die Maven-Abhängigkeit

Um Spring Boot 2.2 in unsere Anwendung aufzunehmen, müssen wir es in unseren Klassenpfad aufnehmen.

Mit Maven können wir einfach die Spring-Boot-Starter- Abhängigkeit hinzufügen :

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

4. Aktivieren Sie die verzögerte Initialisierung

Spring Boot 2.2 führt die Eigenschaft spring.main.lazy-initialization ein , mit der die Konfiguration der verzögerten Initialisierung für die gesamte Anwendung vereinfacht wird.

Wenn Sie den Eigenschaftswert auf true setzen , verwenden alle Beans in der Anwendung eine verzögerte Initialisierung.

Konfigurieren wir die Eigenschaft in unserer Konfigurationsdatei application.yml :

spring: main: lazy-initialization: true

Oder, falls dies der Fall ist, in unserer Datei application.properties :

spring.main.lazy-initialization=true

Diese Konfiguration wirkt sich auf alle Beans im Kontext aus. Wenn wir also die verzögerte Initialisierung für eine bestimmte Bean konfigurieren möchten, können wir dies über den @ Lazy- Ansatz tun .

Darüber hinaus können wir die neue Eigenschaft in Kombination mit der Annotation @Lazy verwenden , die auf false gesetzt ist .

Mit anderen Worten, alle definierten Beans verwenden eine verzögerte Initialisierung, mit Ausnahme derjenigen, die wir explizit mit @Lazy (false) konfigurieren .

5. Führen Sie aus

Lassen Sie uns einen einfachen Service erstellen, mit dem wir testen können, was wir gerade beschrieben haben.

Durch Hinzufügen einer Nachricht zum Konstruktor wissen wir genau, wann die Bean erstellt wird.

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); } }

Lassen Sie uns auch die SpringApplication erstellen und den zuvor erstellten Service einfügen .

@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"); } }

Setzen wir den Eigenschaftswert spring.main.lazy-initialization auf false und führen Sie unsere Anwendung aus.

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

Wie wir sehen können, wurden die Beans beim Start des Anwendungskontexts erstellt.

Ändern Sie nun den Wert von spring.main.lazy-initialization in true und führen Sie unsere Anwendung erneut aus.

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

Infolgedessen hat die Anwendung die Beans beim Start nicht erstellt, sondern nur dann, wenn sie benötigt wurden.

6. Auswirkungen der verzögerten Initialisierung

Das Aktivieren der verzögerten Initialisierung in der gesamten Anwendung kann sowohl positive als auch negative Auswirkungen haben.

Lassen Sie uns über einige davon sprechen, wie sie in der offiziellen Ankündigung der neuen Funktionalität beschrieben sind:

  1. Eine verzögerte Initialisierung kann die Anzahl der Beans verringern, die beim Starten der Anwendung erstellt werden. Daher können wir die Startzeit der Anwendung verbessern
  2. Da keine der Beans erstellt wird, bis sie benötigt werden, können wir Probleme maskieren und sie zur Laufzeit anstatt zur Startzeit bringen
  3. Zu den Problemen können Speicherfehler, Fehlkonfigurationen oder Fehler bei der Definition der Klassendefinition gehören
  4. Wenn wir uns in einem Webkontext befinden, erhöht das Auslösen der Bean-Erstellung bei Bedarf die Latenz von HTTP-Anforderungen. Die Bean-Erstellung wirkt sich nur auf die erste Anforderung aus. Dies kann sich jedoch negativ auf den Lastenausgleich und die automatische Skalierung auswirken .

7. Fazit

In diesem Tutorial haben wir die verzögerte Initialisierung mit der neuen Eigenschaft spring.main.lazy-initialization konfiguriert , die in Spring Boot 2.2 eingeführt wurde.

Wie immer ist der Quellcode für dieses Tutorial auf GitHub verfügbar.