Spring ApplicationListener не получает события - PullRequest
38 голосов
/ 20 апреля 2011

У меня есть следующий 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!");
  }

}

И следующее определение бина:

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

Я вижу, что bean-компонент создается при выводе сообщения от конструктора, но событие запуска контекста никогда не принимается. Чего мне не хватает?

Ответы [ 3 ]

61 голосов
/ 20 апреля 2011

ContextStartedEvent публикуется, когда вы явно вызываете ConfigurableApplicationContext.start() в контексте.Если вам нужно событие, которое публикуется при инициализации контекста, используйте ContextRefreshedEvent.

См. Также:

7 голосов
/ 28 ноября 2012

Поскольку у вас нет отложенных загруженных bean-компонентов (по вашему мнению), вы, скорее всего, используете события по неправильной причине и, вероятно, должны использовать что-то вроде InitializingBean интерфейс вместо:

public class MyBean implements InitializingBean {

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

}

Из руководства Spring:

Для взаимодействия с управлением контейнером жизненного цикла компонента вы можете реализовать интерфейсы Spring InitializingBean и DisposableBean.Контейнер вызывает afterPropertiesSet () для первого и destroy () для второго, чтобы компонент мог выполнять определенные действия при инициализации и уничтожении ваших компонентов.Вы также можете достичь той же интеграции с контейнером, не связывая свои классы с интерфейсами Spring, используя метод init-метод и метаданные определения объекта уничтожения.

Источник: Spring Framework - обратные вызовы жизненного цикла

0 голосов
/ 20 апреля 2011

Не уверен, поможет ли это, но я смутно помню, что у меня была похожая проблема, которая была решена предварительной загрузкой, а не отложенной загрузкой. Вот краткий обзор обоих

...