spring Bean的完整生命週期

spring容器中的bean的完整生命週期一共分爲是11步

1、bean對象的實例化
2、封裝屬性,也就是設置properties中的屬性值
3、如果bean實現了BeanNameAware,則執行setBeanName方法,也就是bean中的id值
4、如果實現了BeanFactoryAware或者ApplicationContextAware,需要設置setBeanFactory或者上下文對象setApplicationContext

5、如果存在類實現BeanPostProcessor後處理bean,執行postProcessBeforeIntialization,可以在初始化之前執行一些方法

6、如果bean實現了InitializingBean,則執行afterPropertiesSet,執行屬性設置之後的操作

7、調用< bean init-method="">執行指定的初始化方法
8、如果存在類實現BeanPostProcess則執行postProcessAfterInitialization,執行初始化之後的操作
9、執行自身的業務方法
10、如果bean實現了DisposableBean,則執行spring的銷燬方法
11、調用< bean destory-method="">執行自定義的銷燬方法。

其中第五步和第八步可以結合aop,在初始化執行之前或者執行之後執行一些操作。

以上就是springbean的生命週期
代碼如下:


/**
 * bean生命週期演示
 */
public class LifeCycle implements BeanNameAware, ApplicationContextAware,
        InitializingBean, DisposableBean {

    private String name;

    public LifeCycle() {
        System.out.println("第一步:實例化類");
    }


    public void setName(String name) {
        System.out.println("第二步:設置屬性");
        this.name = name;
    }

    @Override
    public void setBeanName(String name) {
        System.out.println("第三步:設置bean的名稱也就是spring容器中的" +
                "名稱,也就是id值"+name);
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
      System.out.println("第四步:瞭解工廠信息ApplicationContext");
    }

    //(此處可以加入aop)第五步執行初始化之前執行的方法


    @Override
    public void afterPropertiesSet() throws Exception {
       System.out.println("第六步:屬性設置後執行的方法");
    }

    public void test(){
        System.out.println("第七步:執行自己配置的初始化方法");
    }

    //第八步執行初始化之後執行的方法(此處可以加入AOP)
    public void run(){
        System.out.println("第九步:執行自身的業務方法");
    }


    @Override
    public void destroy() throws Exception {
         System.out.println("第十步:執行spring的銷燬方法");
    }

   public void destory(){
        System.out.println("第十一步:執行自己配置的銷燬方法");
   }


}

指定的類實現了BeanPostProcessor可以實現aop的效果

public class MyBeanPostProcess implements BeanPostProcessor {

    //處理bean,最重要的兩步
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("第五步:初始化之前執行的方法");
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("第八步:初始化之後執行的方法");
        return bean;
    }
}

applicationContext.xml中的配置

<bean id="lifecycle" class="test.springbean.LifeCycle" init-method="test" destroy-method="destory">
        <property name="name" value="張三"/>
    </bean>
    <bean class="test.springbean.MyBeanPostProcess"/>

測試

public class BeanTest {

    @ Test
    public void test(){

        ClassPathXmlApplicationContext  context = new ClassPathXmlApplicationContext
                ("applicationContext.xml");

        LifeCycle lifeCycle = (LifeCycle)context.getBean("lifecycle");
        lifeCycle.run();
        context.close();
    }
}

運行結果如下:

十月 29, 2019 11:23:02 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@12f40c25: startup date [Tue Oct 29 23:23:02 GMT+08:00 2019]; root of context hierarchy
十月 29, 2019 11:23:02 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [applicationContext.xml]
第一步:實例化類
第二步:設置屬性
第三步:設置bean的名稱也就是spring容器中的名稱,也就是id值lifecycle
第四步:瞭解工廠信息ApplicationContext
第五步:初始化之前執行的方法
第六步:屬性設置後執行的方法
第七步:執行自己配置的初始化方法
第八步:初始化之後執行的方法
第九步:執行自身的業務方法
十月 29, 2019 11:23:02 下午 org.springframework.context.support.ClassPathXmlApplicationContext doClose
信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@12f40c25: startup date [Tue Oct 29 23:23:02 GMT+08:00 2019]; root of context hierarchy
第十步:執行spring的銷燬方法
第十一步:執行自己配置的銷燬方法

Process finished with exit code 0
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章