Bean的生命周期
1.生命周期相关概念介绍
- 生命周期:从创建到消亡的完整过程
- bean生命周期:bean从创建到销毁的整体过程
- bean生命周期控制:在bean创建后到销毁前做一些事情
2. Bean销毁时机
容器关闭前触发bean的销毁
关闭容器方式:
- 手工关闭容器
ConfigurableApplicationContext
接口close()
操作 - 注册关闭钩子,在虚拟机退出前先关闭容器再退出虚拟机
ConfigurableApplicationContext
接口registerShutdownHook()
操作
public class AppForLifeCycle {
public static void main( String[] args ) {
//此处需要使用实现类类型,接口类型没有close方法
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
BookDao bookDao = (BookDao) ctx.getBean("bookDao");
bookDao.save();
//注册关闭钩子函数,在虚拟机退出之前回调此函数,关闭容器
ctx.registerShutdownHook();
//关闭容器
//ctx.close();
}
}
3. 配置方式实现Bean生命周期控制
3.1 在要控制的bean中提供生命周期控制方法
/**
* 表示bean初始化对应的操作
*/
public void init(){
System.out.println("init");
}
/**
* 表示bean销毁前对应的操作
*/
public void destory(){
System.out.println("destory");
}
3.2 applicationContext.xml配置
<!--init-method:设置bean初始化生命周期回调函数,此处填写init方法名-->
<!--destroy-method:设置bean销毁生命周期回调函数,仅适用于单例对象,此处填写destory方法名-->
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl" init-method="init" destroy-method="destory"/>
3.2 创建容器获取bean
public class AppForLifeCycle {
public static void main( String[] args ) {
//此处需要使用实现类类型,接口类型没有close方法
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
BookDao bookDao = (BookDao) ctx.getBean("bookDao");
bookDao.save();
//关闭容器,执行销毁的方法
ctx.close();
}
}
3.3 程序运行结果
4. 实现InitializingBean, DisposableBean接口也能控制bean生命周期
package com.lin.dao.daoimpl;
import com.lin.dao.BookDao;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
public class BookDaoImpl implements BookDao , InitializingBean, DisposableBean {
public BookDaoImpl() {
//System.out.println("BookDao的无参构造器");
}
/**
* 数据层实现
*/
public String queryBooks() {
System.out.println("数据层查询书本方法");
return "数据层查询书本方法";
}
@Override
public void destroy() throws Exception {
System.out.println("destory");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("init");
}
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("init");
}
}