Ответ 1
Вы можете поймать ContextRefreshedEvent
с помощью ApplicationListener
.
У меня есть метод в сложной Java-программе, которую нужно вызывать сразу после инициализации веб-приложения ApplicationContext и SpringBeans.
Я попытался объединиться с
<bean id="..." class="..." init-method="initialize">
но этот метод вызовет метод applicationContext.get().getBean(beanId);
.
Мне было интересно, знает ли кто, как это сделать.
Спасибо.
Вы можете поймать ContextRefreshedEvent
с помощью ApplicationListener
.
В Spring 4.2 вы можете присоединить прослушиватели событий к событиям жизненного цикла Springs (и вашим собственным) с помощью аннотаций. Просто добавьте @EventListener к методу и включите тип события в качестве первого (и единственного) параметра и Spring автоматически обнаружит его и подключит.
https://spring.io/blog/2015/02/11/better-application-events-in-spring-framework-4-2
@Component
public class MyListener {
@EventListener
public void handleContextRefresh(ContextRefreshedEvent event) {
...
}
}
Вы можете использовать ApplicationListener<E>
для этой цели. В параметре общего типа вы можете использовать ContextRefreshedEvent
для вас. И обратите внимание, что в переопределенном методе onApplicationEvent
вы можете сделать что-нибудь вроде autowire bean или использовать его как услугу или вызвать другую услугу здесь. И обратите внимание, что его отличие от @PostConstructor
public class MyContextRefreshListener implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
//do what you want
}
}
Вы можете добавить пользовательский BeanFactoryPostProcessor, который имеет доступ к bean.