Ответ 1
ContextStartedEvent
публикуется, когда вы явно вызываете ConfigurableApplicationContext.start()
в контексте. Если вам нужно событие, которое публикуется при инициализации контекста, используйте ContextRefreshedEvent
.
См. также:
У меня есть следующий 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 создается, когда печатается сообщение из конструктора, но событие начала события никогда не получает. Что мне не хватает?
ContextStartedEvent
публикуется, когда вы явно вызываете ConfigurableApplicationContext.start()
в контексте. Если вам нужно событие, которое публикуется при инициализации контекста, используйте ContextRefreshedEvent
.
См. также:
Поскольку у вас нет ленивого загруженного 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 - обратные вызовы жизненного цикла
Не уверен, что это помогает, но я смутно помню, что у меня была аналогичная проблема, которая была решена путем предварительной загрузки и не ленивой загрузки. Здесь быстрый обзор как