蓝易云

SpringBean 初始化的执行各方法的顺序

148次阅读
没有评论

共计 2085 个字符,预计需要花费 6 分钟才能阅读完成。

Spring 容器在创建 SpringBean 的时候,会帮我们自动给属性赋值,还有一些初始化方法和一些增强的方法。

因此,了解这些方法的顺序很有必要,这样可以了解方法增强的时机,有助于更好地编写代码。

通过如下案例可以看见执行的先后顺序:

MyBean.java

@Data
public class MyBean implements InitializingBean {

    private String value;

    public MyBean() {
        System.out.println("构造方法...");
    }

    @Autowired
    public void setValue(@Value("${JAVA_HOME}") String value){
        this.value = value;
        System.out.println("属性赋值...");
    }

    public void initMethod(){
        System.out.println("initMethod...");
    }

    public void destroyMethod(){
        System.out.println("destroyMethod...");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("afterPropertiesSet...");
    }

    @PostConstruct
    public void postConstruct() {
        System.out.println("PostConstruct...");
    }

    @PreDestroy
    public void preDestroy() {
        System.out.println("PreDestroy...");
    }
}

后处理器 MyBeanPostProcessor.java

public class MyBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("BeanPostProcessor的before...");
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("BeanPostProcessor的after...");
        return bean;
    }
}

配置类 Config.java

@Configuration
public class Config {

    // 这里如果配置 @ComponentScan 就无法得到 initMethod 的执行顺序
    @Bean(initMethod = "initMethod", destroyMethod = "destroyMethod")
    public MyBean myBean(){
        return new MyBean();
    }

    @Bean
    public MyBeanPostProcessor myBeanPostProcessor(){
        return new MyBeanPostProcessor();
    }
}

测试类 BeanInitTest.java

public class BeanInitTest {

    public static void main(String[] args) {

        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Config.class);
        System.out.println("#=======================================#");
        applicationContext.close();
    }
}

执行结果如下:

构造方法...
属性赋值...
BeanPostProcessor的before...
PostConstruct...
afterPropertiesSet...
initMethod...
BeanPostProcessor的after...
#=======================================#
PreDestroy...
destroyMethod...

由此可以得到结论,创建时最开始执行构造函数,再执行属性赋值方法,然后执行 bean 后处理器的 before 方法。再是执行 @PostConstruct 标注的方法,然后执行 InitializingBean 接口的 afterPropertiesSet 方法,再执行 @Bean 指定的初始化方法,再执行 bean 后处理器的 after 方法。

而执行销毁时,先执行 @PreDestroy 标注的方法,再执行 @Bean 指定的销毁方法。

AD:【腾讯云服务器大降价】2核4G 222元/3年 1核2G 38元/年
正文完
 0
阿蛮君
版权声明:本站原创文章,由 阿蛮君 于2024-12-06发表,共计2085字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
Copyright © 2022-2024 阿蛮君博客 湘ICP备2023001393号
本网站由 亿信互联 提供云计算服务 | 蓝易云CDN 提供安全防护和加速服务
Powered by Wordpress  Theme by Puock