2011-04-20 5 views
37

je l'ApplicationListener suivante:Spring ApplicationListener ne reçoit pas les événements

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 suivant:

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

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

+0

Faut-il avoir une annotation @component? – borjab

Répondre

58

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 aussi:

+8

Notez que 'ContextRefreshedEvent' peut être publié plus d'une fois, et donc il peut également être publié avant que tous les beans ne soient initialisés (par exemple lors de l'utilisation de CXF 2.4.2 ...). Cependant, dans la configuration la plus courante, 'ContextRefreshedEvent' sera en effet publié uniquement lorsque le démarrage en contexte est terminé. –

+1

C'est super incomfortable. Où écrire cette ligne magique? – gstackoverflow

0

Je ne sais pas si cela aide, mais je me souviens vaguement avoir un problème similaire, qui a été résolu par le préchargement et non par chargement paresseux. Voici un quick overview des deux

+0

Je n'ai pas de haricot paresseux-initalized dans mon contexte. –

7

Puisque vous n'avez pas de haricots chargés paresseux (selon vous), vous utilisez le plus probable des événements pour la mauvaise raison et devrait probablement utiliser quelque chose comme InitializingBean l'interface à la place:

public class MyBean implements InitializingBean { 

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

} 

F rom manuel de printemps:

Interagir avec la gestion du cycle de vie de haricot du conteneur, vous pouvez mettre en œuvre le printemps InitializingBean et DisposableBean interfaces. Le conteneur appelle afterPropertiesSet() pour l'ancien et destroy() pour que ce dernier autorise le bean à effectuer certaines actions lors de l'initialisation et de la destruction de vos beans. Vous pouvez également réaliser la même intégration avec le conteneur sans coupler vos classes aux interfaces Spring à l'aide de la méthode init et détruire les métadonnées de définition d'objet de méthode.

Source: Spring Framework - Lifecycle callbacks

+0

Je pense que la méthode afterPropertiesSet s'applique à un seul bean, pas à l'ensemble du contexte de l'application printanière. http://docs.spring.io/spring/docs/2.5.6/api/org/springframework/beans/factory/InitializingBean.html –

Questions connexes