通过spring工厂,可以控制bean的生命周期。
通过 init-method属性 指定初始化后的调用方法
通过 destroy-method属性 指定销毁对象前的方法
在xml配置Bean的初始化和销毁方法
//生命周期测试
public class LifeCycleBean {
public LifeCycleBean() {
System. out. println("LifeCycleBean构造方法" )
}
public void init(){
System . out . print1n("LifeCycleBean初始化");
}
public void distroy(){
System. out .println("LifeCycleBean销毁");
}
}
<!-- bean的生命周期-->
<bean id= "lifecycle" class= "cn. yanqi. lifecycle. Lifecycle" init -method= "init" destroy -method= "dos tory "></bean>
测试:
public void testInitDestroy() throws Exception{
//1.获取工厂
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext . xml");
//2.得到对象
LifeCycleBean lifeCycleBean = (LifeCycleBean) applicationContext . getBean("lifeCycleBean");
System. out. println(lifeCycleBean);
}
测试查看控制台打印,发现销毁方法没有执行。
原因:销毁方法的执行必须满足两个条件:
- 单例(singleton)的bean才可以手动销毁。
- 必须手动关闭容器(close)时,才会执行手动销毁的方法。
单例是由容器创建的,那销毁也是由容器销毁的
销毁命令测试:
@Test
public void test(){
//先得到spring容器
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext . xm1");
//从容器获取bean对象
LifeCycleBean lifeCycleBean= (LifeCycleBean) applicationContext . getBean("lifeCycleBean");
//使用junit调试的时候,当调试完成,junit强行关闭jvm,但此时spring容器还没来得及关闭,所以,不会出现销毁方法。
//要想看销毁bean的方法执行,必须手动关闭spring容器。
((ClassPathXmlApplicationContext)applicationContext).close();
//单例是由容器初始化时创建和容器关闭销毁的,但多例不是由容器创建时创建,容器关闭时也不会销毁多例。
}
多例没就destroy-method 方法,只对单例有作用