細品Spring Bean的生命週期

spring bean的生命週期官方的流程圖如下:

接下來 我們用代碼驗證一下是否如圖所願:

首先定義一個testBean

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

/**
 *
 * @author runtu
 * @version TestBean, v2.0 2019/12/13 9:19
 **/
public class TestBean implements BeanNameAware, BeanFactoryAware, ApplicationContextAware,
                      InitializingBean, DisposableBean {

    public TestBean() {
        System.out.println("=====================構造方法========================");
    }

    @Override
    public void setBeanName(String s) {
        System.out.println("=====================BeanNameAware========================");
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("=====================BeanFactoryAware========================");
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("=====================ApplicationContextAware========================");
    }

    @Override
    public void afterPropertiesSet() {
        System.out.println("=====================InitializingBean========================");
    }

    @Override
    public void destroy() {
        System.out.println("=====================DisposableBean========================");
    }

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

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

再定義一個自定義的MySpringBeanPostProcessor,主要是重寫了BeanPostProcessor接口的postProcessBeforeInitialization與postProcessAfterInitialization方法。

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;

/**
 *
 * @author runtu
 * @version MySpringBeanPostProcessor, v2.0 2019/12/13 9:25
 **/
@Component
public class MySpringBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean,
                                                  String beanName) throws BeansException {

        if (bean instanceof TestBean) {
            System.out.println(
                "=====================postProcessBeforeInitialization========================");
        }
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean,
                                                 String beanName) throws BeansException {
        if (bean instanceof TestBean) {
            System.out.println(
                "=====================postProcessAfterInitialization========================");
        }
        return bean;
    }
}

此處我工程爲springboot,把TestBean注入之後,啓動項目

@Bean(initMethod = "init", destroyMethod = "shutdown")
public TestBean testBean() {
     return new TestBean();
}

把一些無關的日誌剃掉之後,控制檯打印結果如下:

# 啓動程序之後控制檯依次打印:

=====================構造方法========================
=====================BeanNameAware========================
=====================BeanFactoryAware========================
=====================ApplicationContextAware========================
=====================postProcessBeforeInitialization========================
=====================InitializingBean========================
=====================init========================
=====================postProcessAfterInitialization========================

# 停止程序之後依次打印:
=====================DisposableBean========================
=====================shutdown========================

over。。。。

 

 

發佈了127 篇原創文章 · 獲贊 203 · 訪問量 1673萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章