2011-04-20 8 views
37

Tengo el siguiente ApplicationListener:primavera ApplicationListener no está recibiendo eventos

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

} 

Y la siguiente definición de frijol:

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

puedo ver que el frijol se crea como mensaje se imprime el constructor, pero el evento de inicio de contexto nunca se recibe. ¿Qué me estoy perdiendo?

+0

en caso de que tenga una anotación de @Component? – borjab

Respuesta

58

ContextStartedEvent se publica cuando se invoca explícitamente ConfigurableApplicationContext.start() en el contexto. Si necesita un evento publicado cuando se inicializa el contexto, use ContextRefreshedEvent.

Consulte también:

+8

Tenga en cuenta que 'ContextRefreshedEvent' se puede publicar más de una vez y, por lo tanto, también se puede publicar antes de que se inicialicen todos los beans (por ejemplo, al usar CXF 2.4.2 ...). Sin embargo, en la configuración más común, 'ContextRefreshedEvent' se publicará solo cuando finalice el inicio contextualizado. –

+1

Es súper incómodo. ¿Dónde escribir esta fila mágica? – gstackoverflow

0

No estoy seguro de si esto ayuda, pero recuerdo vagamente tener un problema similar, que se resolvió mediante la carga previa y no la carga lenta. Aquí hay un quick overview de ambos

+0

No tengo frijoles perezosos en mi contexto. –

7

Como no tiene granos cargados perezosos (según usted), entonces es muy probable que el uso de eventos por la razón equivocada y probablemente debería usar algo como InitializingBean interfaz en su lugar:

public class MyBean implements InitializingBean { 

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

} 

F rom manual de primavera:

para interactuar con la gestión del contenedor del ciclo de vida del bean, puede implementar el InitializingBean primavera y DisposableBean interfaces. El contenedor llama a afterPropertiesSet() para el anterior y destroy() para que este último permita al bean realizar determinadas acciones al inicializar y destruir sus beans. Puede también lograr la misma integración con el contenedor sin acoplar sus clases a las interfaces de Spring mediante el uso de init-method y destruir metadatos de definición de objeto de método.

Fuente: Spring Framework - Lifecycle callbacks

+0

Creo que el método afterPropertiesSet se aplica a un solo bean, no a todo el contexto de la aplicación de primavera. http://docs.spring.io/spring/docs/2.5.6/api/org/springframework/beans/factory/InitializingBean.html –

Cuestiones relacionadas