Eine Kurzanleitung zur Spring @ Lazy Annotation

1. Übersicht

Standardmäßig erstellt Spring alle Singleton-Beans eifrig beim Start / Bootstrapping des Anwendungskontexts. Der Grund dafür ist einfach: Alle möglichen Fehler sofort und nicht zur Laufzeit zu vermeiden und zu erkennen.

Es gibt jedoch Fälle, in denen wir eine Bean erstellen müssen, nicht beim Start des Anwendungskontexts, sondern wenn wir sie anfordern.

In diesem kurzen Tutorial werden wir uns mit der @ Lazy- Annotation von Spring befassen .

2. Lazy Initialization

Die Annotation @Lazy ist seit der Frühjahrsversion 3.0 vorhanden. Es gibt verschiedene Möglichkeiten, den IoC-Container anzuweisen, eine Bean träge zu initialisieren.

2.1. @Configuration Class

Wenn wir die @ Lazy- Annotation über die @ Configuration- Klasse setzen, bedeutet dies, dass alle Methoden mit der @ Bean- Annotation träge geladen werden sollten .

Dies entspricht dem Attribut default-lazy-init = "true " der XML-basierten Konfiguration .

Schauen wir uns das hier an:

@Lazy @Configuration @ComponentScan(basePackages = "com.baeldung.lazy") public class AppConfig { @Bean public Region getRegion(){ return new Region(); } @Bean public Country getCountry(){ return new Country(); } }

Testen wir nun die Funktionalität:

@Test public void givenLazyAnnotation_whenConfigClass_thenLazyAll() { AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); ctx.register(AppConfig.class); ctx.refresh(); ctx.getBean(Region.class); ctx.getBean(Country.class); }

Wie wir sehen, werden alle Bohnen nur erstellt, wenn wir sie zum ersten Mal anfordern:

Bean factory for ...AnnotationConfigApplicationContext: ...DefaultListableBeanFactory: [...]; // application context started Region bean initialized Country bean initialized

Um dies nur auf eine bestimmte Bean anzuwenden, entfernen wir @Lazy aus einer Klasse.

Dann fügen wir es der Konfiguration der gewünschten Bean hinzu:

@Bean @Lazy(true) public Region getRegion(){ return new Region(); }

2.2 Mit @Autowired

Bevor Sie fortfahren, lesen Sie in diesen Handbüchern die Anmerkungen @Autowired und @Component .

Hier , um einen faulen Bohne zu initialisieren, wir verweisen sie von einem anderen.

Die Bohne, die wir träge laden wollen:

@Lazy @Component public class City { public City() { System.out.println("City bean initialized"); } }

Und es ist Referenz:

public class Region { @Lazy @Autowired private City city; public Region() { System.out.println("Region bean initialized"); } public City getCityInstance() { return city; } }

Beachten Sie, dass @Lazy an beiden Stellen obligatorisch ist.

Mit der @ Component- Annotation für die City- Klasse und beim Verweisen auf @Autowired:

@Test public void givenLazyAnnotation_whenAutowire_thenLazyBean() { // load up ctx appication context Region region = ctx.getBean(Region.class); region.getCityInstance(); }

Hier wird die City- Bean nur initialisiert, wenn wir die Methode getCityInstance () aufrufen .

3. Fazit

In diesem kurzen Tutorial haben wir die Grundlagen der @ Lazy- Annotation von Spring gelernt . Wir haben verschiedene Möglichkeiten zur Konfiguration und Verwendung untersucht.

Wie üblich ist der vollständige Code für dieses Handbuch auf GitHub verfügbar.