这课我们来谈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

}



}