java - Execute method on startup in Spring

ID : 20406

viewed : 11

Tags : javaspringjava

Top 5 Answer for java - Execute method on startup in Spring

vote vote

98

If by "application startup" you mean "application context startup", then yes, there are many ways to do this, the easiest (for singletons beans, anyway) being to annotate your method with @PostConstruct. Take a look at the link to see the other options, but in summary they are:

  • Methods annotated with @PostConstruct
  • afterPropertiesSet() as defined by the InitializingBean callback interface
  • A custom configured init() method

Technically, these are hooks into the bean lifecycle, rather than the context lifecycle, but in 99% of cases, the two are equivalent.

If you need to hook specifically into the context startup/shutdown, then you can implement the Lifecycle interface instead, but that's probably unnecessary.

vote vote

88

This is easily done with an ApplicationListener. I got this to work listening to Spring's ContextRefreshedEvent:

import org.springframework.context.ApplicationListener; import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.stereotype.Component;  @Component public class StartupHousekeeper implements ApplicationListener<ContextRefreshedEvent> {    @Override   public void onApplicationEvent(final ContextRefreshedEvent event) {     // do whatever you need here    } } 

Application listeners run synchronously in Spring. If you want to make sure you're code is executed only once, just keep some state in your component.

UPDATE

Starting with Spring 4.2+ you can also use the @EventListener annotation to observe the ContextRefreshedEvent (thanks to @bphilipnyc for pointing this out):

import org.springframework.context.ApplicationListener; import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.stereotype.Component;  @Component public class StartupHousekeeper {    @EventListener(ContextRefreshedEvent.class)   public void contextRefreshedEvent() {     // do whatever you need here    } } 
vote vote

79

In Spring 4.2+ you can now simply do:

@Component class StartupHousekeeper {      @EventListener(ContextRefreshedEvent.class)     public void contextRefreshedEvent() {         //do whatever     } } 
vote vote

66

If you are using spring-boot, this is the best answer.

I feel that @PostConstruct and other various life cycle interjections are round-about ways. These can lead directly to runtime issues or cause less than obvious defects due to unexpected bean/context lifecycle events. Why not just directly invoke your bean using plain Java? You still invoke the bean the 'spring way' (eg: through the spring AoP proxy). And best of all, it's plain java, can't get any simpler than that. No need for context listeners or odd schedulers.

@SpringBootApplication public class DemoApplication {      public static void main(String[] args) {         ConfigurableApplicationContext app = SpringApplication.run(DemoApplication.class, args);          MyBean myBean = (MyBean)app.getBean("myBean");          myBean.invokeMyEntryPoint();     } } 
vote vote

56

With SpringBoot, we can execute a method on startup via @EventListener annotation

@Component public class LoadDataOnStartUp {        @EventListener(ApplicationReadyEvent.class)     public void loadData()     {         // do something     } }  

Top 3 video Explaining java - Execute method on startup in Spring

Related QUESTION?