it-swarm.com.de

Spring ApplicationListener empfängt keine Ereignisse

Ich habe den folgenden ApplicationListener:

package org.mycompany.listeners;

import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextStartedEvent;

public class MyApplicationListener implements ApplicationListener<ContextStartedEvent> {

  public MyApplicationListener() {
    super();
    System.out.println("Application context listener is created!");
  }

  /**
   * {@inheritDoc}
   */
  public void onApplicationEvent(final ContextStartedEvent event) {
    System.out.println("Context '" + event.getApplicationContext().getDisplayName() + "' is started!");
  }

}

Und die folgende Bean-Definition:

<bean name="myApplicationListener" class="org.mycompany.listeners.MyApplicationListener" />

Ich kann sehen, dass die Bean erstellt wird, wenn eine Nachricht vom Konstruktor gedruckt wird, das Kontextstartereignis jedoch nie empfangen wird. Was vermisse ich?

38

ContextStartedEvent wird veröffentlicht, wenn Sie ConfigurableApplicationContext.start() im Kontext explizit aufrufen. Wenn Sie ein Ereignis benötigen, das bei der Initialisierung des Kontextes veröffentlicht wird, verwenden Sie ContextRefreshedEvent.

Siehe auch:

61
axtavt

Da Sie keine faul geladenen Beans (Ihrer Meinung nach) haben, verwenden Sie höchstwahrscheinlich Ereignisse aus einem falschen Grund und sollten stattdessen etwas wie InitializingBean interface verwenden:

public class MyBean implements InitializingBean {

    @Override
    public void afterPropertiesSet() throws Exception {
        // ...
    }

}

Ab Frühjahr Handbuch: 

Um mit der Verwaltung des Containers des Bean-Lebenszyklus zu interagieren, können Sie kann Spring InitializingBean und DisposableBean implementieren Schnittstellen. Der Container ruft afterPropertiesSet () für das vorherige .__ auf. und destroy () für letzteres, damit das Bean bestimmte Aktionen bei der Initialisierung und Zerstörung Ihrer Bohnen. Sie können erreichen Sie die gleiche Integration mit dem Container auch ohne Kopplung Ihre Klassen zu Spring-Schnittstellen durch die Verwendung von init-method und Metadaten der Methodenobjektdefinition zerstören.

Quelle: Spring Framework - Lebenszyklus-Rückrufe

7
Mike Minicki

Ich bin mir nicht sicher, ob das hilft, aber ich erinnere mich vage daran, dass es ein ähnliches Problem gab, das durch Vorladen und nicht durch Lazy Loading gelöst wurde. Hier ist ein schneller Überblick von beiden 

0
qwerty