这课我们来谈bean的生命周期。

 

  所谓生命周期,指的是从对象的创建直到被销毁的过程。一般而言,bean的生命周期包含以下几个过程:

创建->初始化(通过执行初始化方法来完成初始化)->执行各种操作->销毁(销毁前执行销毁方法)

 

创建已经讲过了,通过constructor-args或者property来注入属性,执行各种操作不需要讲,这节课要讲的就是初始化和销毁,也即设置初始化方法和销毁方法。

 

<!--

    指定初始化方法: 使用init-method属性指定具有void无参数的方法的名称

             注意: 初始化方法必须是返回值类型为void且无参数的方法

-->

<!--

       指定销毁方法: 使用destroy-method属性指定具有void无参数的方法的名称

              注意: 销毁方法必须是返回值类型为void且无参数的方法

   -->

<bean id="student" class="com.ioc.bean.Student" init-method="init" destroy-method="destroy">

    <property name="id" value="1001"></property>

    <property name="age" value="20"></property>

    <property name="name" value="小叶"></property>

</bean>





<bean id="student2" class="com.ioc.bean.Student" init-method="init" scope="prototype" destroy-method="destroy">

    <property name="id" value="1001"></property>

    <property name="age" value="20"></property>

    <property name="name" value="小明"></property>

</bean>

 

测试:

package com.ioc.main;



import com.ioc.bean.Student;

import org.junit.Before;

import org.junit.Test;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;



public class IoCTeachTest04 {



    ApplicationContext applicationContext;



    @Before

    public void init()

    {

        applicationContext = new ClassPathXmlApplicationContext("com/ioc/config/bean04.xml");

    }



    @Test

    public void test()

    {

        //我们就什么都不写,看会发生什么

        //我们什么也没做,只是初始化了IoC容器,然后初始化IoC容器的时候单例bean也会跟着创建,

        // 而创建完单例bean后紧接着就会立即调用它的初始化方法,因此也就输出了"这是Student类的初始化方法"

        //我们可以用多例bean来验证一下

        applicationContext.getBean("student2", Student.class);

        applicationContext.getBean("student2", Student.class);

        applicationContext.getBean("student2", Student.class);

        applicationContext.getBean("student2", Student.class);



        //接着来测销毁方法

        //现在有个问题,对象什么时候销毁?程序结束?不,只需要销毁容器即可, ClassPathXmlApplicationContext调用registerShutdownHook()方法

        ((ClassPathXmlApplicationContext)applicationContext).registerShutdownHook();

        //只输出了小叶的销毁方法

        //由此可见,Spring的IoC容器并不负责销毁多例bean

    }



}