SpringBoot中各类初始化方法顺序比较

在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");
    }
}

在这里插入图片描述

发布了26 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_36142042/article/details/97313658