Подтвердить что ты не робот

Spring ApplicationListener не принимает события

У меня есть следующий 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:

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

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

4b9b3361

Ответ 1

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

См. также:

Ответ 2

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

public class MyBean implements InitializingBean {

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

}

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

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

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

Ответ 3

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