Spring Application Context-Ereignisse

Kontextereignisse für Spring-Anwendungen

1. Einführung

In diesem Tutorial erfahren Sie mehr über den Ereignisunterstützungsmechanismus, der vom Spring-Framework bereitgestellt wird. Wir werden die verschiedenen integrierten Ereignisse untersuchen, die vom Framework bereitgestellt werden, und dann sehen, wie ein Ereignis verwendet wird.

Informationen zum Erstellen und Veröffentlichen von benutzerdefinierten Ereignissen finden Sie unterour previous tutorial here.

Spring verfügt über einen Ereignismechanismus, der aufApplicationContext. basiert. Er kann fürexchange information between different beans. verwendet werden. Wir können Anwendungsereignisse verwenden, indem wir auf Ereignisse warten und benutzerdefinierten Code ausführen.

Ein Szenario hier wäre beispielsweise die Ausführung einer benutzerdefinierten Logik beim vollständigen Start vonApplicationContext.

2. Standard-Kontextereignisse

Tatsächlich gibt es im Frühjahr eine Vielzahl von integrierten Ereignissen, nämlichlets a developer hook into the lifecycle of an application and the context und einige benutzerdefinierte Operationen.

Obwohl wir diese Ereignisse selten manuell in einer Anwendung verwenden, verwendet das Framework sie intensiv in sich. Beginnen wir mit der Erkundung verschiedener integrierter Ereignisse im Frühjahr.

2.1. ContextRefreshedEvent

Bei beideninitializing or refreshing the*ApplicationContext*, erhöht Spring dieContextRefreshedEvent. Normalerweise kann eine Aktualisierung mehrere Male ausgelöst werden, solange der Kontext nicht geschlossen wurde.

Beachten Sie, dass das Ereignis auch manuell ausgelöst werden kann, indem die Methoderefresh()auf der SchnittstelleConfigurableApplicationContextaufgerufen wird.

2.2. ContextStartedEvent

By calling the start() method aufConfigurableApplicationContext, lösen wir dieses Ereignis aus und starten dieApplicationContext. Tatsächlich wird die Methode normalerweise verwendet, um Beans nach einem expliziten Stopp neu zu starten. Wir können die Methode auch verwenden, um Komponenten ohne Konfiguration für den Autostart zu behandeln.

Hierbei ist zu beachten, dass der Aufruf vonstart() im Gegensatz zu immer explizit ist Aktualisierung ().

2.3. ContextStoppedEvent

EinContextStoppedEvent wirdwhen the ApplicationContext is stopped veröffentlicht, indem diestop()-Methode fürConfigurableApplicationContext. aufgerufen wird. Wie bereits erwähnt, können wir ein gestopptes Ereignis mithilfe derstart()-Methode neu starten.

2.4. ContextClosedEvent

Dieses Ereignis wirdwhen the ApplicationContext is closed mit der Methodeclose() inConfigurableApplicationContext veröffentlicht. In Wirklichkeit können wir einen Kontext nach dem Schließen nicht neu starten.

Ein Kontext erreicht sein Lebensende, wenn er geschlossen wird, und daher können wir ihn nicht wie inContextStoppedEvent. neu starten

3. @EventListener

Lassen Sie uns als Nächstes untersuchen, wie die veröffentlichten Ereignisse verwendet werden. Ab Version 4.2 unterstützt Spring einen annotationsgesteuerten Ereignis-Listener -@EventListener.

Insbesondere können wir diese Annotation zuautomatically register an ApplicationListener based on the signature of the method verwenden:

@EventListener
public void handleContextRefreshEvent(ContextStartedEvent ctxStartEvt) {
    System.out.println("Context Start Event received.");
}

Bezeichnenderweise@EventListener is a core annotation and hence doesn’t need any extra configuration. Tatsächlich bietet das vorhandene<context:annotation-driven/>-Element volle Unterstützung.

Eine mit@EventListener annotierte Methode kann einen nicht leeren Typ zurückgeben. Wenn der zurückgegebene Wert nicht null ist, veröffentlicht der Ereignismechanismus ein neues Ereignis für ihn.

3.1. Mehrere Ereignisse anhören

Jetzt kann es zu Situationen kommen, in denen der Listener mehrere Ereignisse verarbeiten muss.

Für ein solches Szenario können wir das Attributclassesverwenden:

@EventListener(classes = { ContextStartedEvent.class, ContextStoppedEvent.class })
public void handleMultipleEvents() {
    System.out.println("Multi-event listener invoked");
}

4. Listener von Anwendungsereignissen

Wenn wir frühere Versionen von Spring (<4.2) verwenden, müssen wircustom ApplicationEventListener and override the method onApplicationEvent einführen, um ein Ereignis anzuhören.

5. Fazit

In diesem Artikel haben wir die verschiedenen integrierten Ereignisse im Frühjahr untersucht. Darüber hinaus haben wir verschiedene Möglichkeiten gesehen, um die veröffentlichten Ereignisse anzuhören.

Wie immer finden Sie die im Artikel verwendeten Codefragmente inover on Github.