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