1. Überblick
Spring erstellt alle Singleton-Beans standardmäßig beim Starten/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 ein Bean erstellen müssen, nicht beim Start des Anwendungskontexts, sondern wenn wir es anfordern
In diesem kurzen Tutorial werden wir die @ Lazy -Annotation von Spring besprechen. **
2. Faule Initialisierung
Die @ Lazy -Annotation ist seit der Frühlingsversion 3.0 vorhanden.
Es gibt mehrere Möglichkeiten, den IoC-Container anzuweisen, eine Bohne 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 ist das Äquivalent für das default-lazy-init = „true “ -Attribut der XML-basierten Konfiguration.
Schauen wir uns das mal 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();
}
}
Lassen Sie uns nun die Funktionalität testen:
@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 Beans 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 Konfig 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 nach @Autowired und @Component Anmerkungen.
Um eine Lazy Bean zu initialisieren, referenzieren wir sie von einer 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 eine 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 Annotation @ Component für die City -Klasse und beim Verweisen mit @ 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 beim Aufruf der getCityInstance () -Methode initialisiert.
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 geprüft.
Wie üblich ist der vollständige Code für dieses Handbuch verfügbar: over auf GitHub .