在SpringBoot开发中想要在项目启动时执行一段代码,我们通常的做法有如下几种:
1、实现接口ApplicationRunner
@Configuration
public class TestApplicationRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("init ApplicationRunner");
}
}
2、实现接口CommandLineRunner
@Configuration
public class TestCommandLineRunner implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
System.out.println("init CommandLineRunner");
}
}
3、实现接口InitializingBean
@Configuration
public class TestInitBean implements InitializingBean {
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("init InitializingBean");
}
}
4.实现接口ServletContextListener
@Configuration
public class TestServletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("init ServletContextListener");
}
}
5、使用注解PostConstruct
@Configuration
public class TestPostConstruct {
@PostConstruct
public void init(){
System.out.println("init PostConstruct");
}
}
启动项目来看结果:
以上测试是基于springboot2.1.4.RELEASE进行的。
还有一个接口BeanPostProcessor,经常用于在bean执行前后插入代码,例如
@Configuration
public class TestBeanPostProcessor implements BeanPostProcessor {
@Nullable
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("init bean:"+beanName + "before");
return bean;
}
@Nullable
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("init bean:"+beanName+" after");
return bean;
}
}
虽然实现BeanPostProcessor后,执行会比实现ServletContextListener靠前很多,但是每个bean实例化都会执行,明显不适合用于做初始化。
但是BeanPostProcessor和@PostConstruct组合使用会有意向不到的效果。
@Configuration
public class TestBeanPostAndPostConstruct implements BeanPostProcessor {
@PostConstruct
public void init(){
System.out.println("init BeanPostProcessor+PostConstruct");
}
}