Вызов метода После того, как все SpringBeans и ApplicationContext были инициализированы

У меня есть метод в сложной Java-программе, которую нужно вызывать сразу после инициализации веб-приложения ApplicationContext и SpringBeans.

Я попытался объединиться с <bean id="..." class="..." init-method="initialize"> но этот метод вызовет метод applicationContext.get().getBean(beanId);.

Мне было интересно, знает ли кто, как это сделать.

Спасибо.

Ответ 1

Вы можете поймать ContextRefreshedEvent с помощью ApplicationListener.

Ответ 2

В 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) {
        ...
    }
}

Ответ 3

Вы можете использовать ApplicationListener<E> для этой цели. В параметре общего типа вы можете использовать ContextRefreshedEvent для вас. И обратите внимание, что в переопределенном методе onApplicationEvent вы можете сделать что-нибудь вроде autowire bean или использовать его как услугу или вызвать другую услугу здесь. И обратите внимание, что его отличие от @PostConstructor

public class MyContextRefreshListener implements ApplicationListener<ContextRefreshedEvent> {

    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        //do what you want
    }
}

Ответ 4

Вы можете добавить пользовательский BeanFactoryPostProcessor, который имеет доступ к bean.