web-dev-qa-db-fra.com

Spring ApplicationListener ne reçoit pas d'événements

J'ai le ApplicationListener suivant:

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!");
  }

}

Et la définition de haricot suivante:

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

Je peux voir que le bean est créé lorsque le message du constructeur est imprimé, mais l'événement de démarrage contextuel n'est jamais reçu. Qu'est-ce que je rate?

38
Andrey Adamovich

ContextStartedEvent est publié lorsque vous appelez explicitement ConfigurableApplicationContext.start() sur le contexte. Si vous avez besoin d'un événement publié lorsque le contexte est initialisé, utilisez ContextRefreshedEvent.

Voir également:

61
axtavt

Puisque vous n'avez pas de beans chargés paresseux (selon vous), vous utilisez probablement des événements pour une mauvaise raison et utilisez probablement quelque chose comme InitializingBean interface:

public class MyBean implements InitializingBean {

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

}

Du manuel de printemps: 

Pour interagir avec la gestion du cycle de vie du bean par le conteneur, vous peut implémenter Spring InitializingBean et DisposableBean interfaces. Le conteneur appelle afterPropertiesSet () pour l'ancien et détruire () pour que ce dernier permette au haricot d’effectuer certaines tâches actions lors de l'initialisation et la destruction de vos haricots. Vous pouvez réaliser également la même intégration avec le conteneur sans couplage vos classes aux interfaces Spring en utilisant init-method et détruire les métadonnées de définition d'objet de méthode.

Source: Framework Spring - Rappels de cycle de vie

7
Mike Minicki

Pas sûr que cela aide, mais je me souviens vaguement d'avoir un problème similaire, qui a été résolu par un préchargement et non par un chargement paresseux. Voici un aperçu rapide des deux 

0
qwerty