Eine kurze Einführung in die @Lazy Annotation von Spring

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 .