19

I have a method in a complex java program that needs to be called immediately after the web ApplicationContext and SpringBeans have been initialized.

I've tried toying around with <bean id="..." class="..." init-method="initialize"> but this method will call a applicationContext.get().getBean(beanId); method.

I was wondering if anyone knows how to do this.

Thank you.

Kelly
  • 193
  • 1
  • 1
  • 4

4 Answers4

24

In Spring 4.2 onwards you can attach event listeners to Springs Lifecycle events (and your own) using annotations. Simple add the @EventListener to a method and include the event type as the first (and only) parameter and Spring will automatically detect it and wire it up.

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) {
        ...
    }
}
Herbie Porter
  • 273
  • 2
  • 7
15

You may catch a ContextRefreshedEvent with ApplicationListener.

axtavt
  • 239,438
  • 41
  • 511
  • 482
5

You can use ApplicationListener<E> for this purpose. In the generic type parameter you could use ContextRefreshedEvent for you requirement. And keep note that, in the overridden method onApplicationEvent you can do anything like autowire a bean or use it as a service or call another service from here. And note that how its different from @PostConstructor

public class MyContextRefreshListener implements ApplicationListener<ContextRefreshedEvent> {

    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        //do what you want
    }
}
Shafin Mahmud
  • 3,831
  • 1
  • 23
  • 35
1

You could add a custom BeanFactoryPostProcessor which has access to the bean in question.

earldouglas
  • 13,265
  • 5
  • 41
  • 50