提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
我们已经了解了IOC容器创建、环境配置以及IOC对象的三种实例化方式,现在我们学习bean的生命周期,了解bean对象从创建到销毁的整体过程
一、Bean的生命周期
对于生命周期,我们主要围绕着
bean
生命周期控制
- 首先我们理解什么是生命周期?
从创建到消亡的完整过程
,
例如人从出生到死亡的整个过程就是一个生命周期。
bean对象从创建到销毁的整体过程
- bean生命周期控制是什么?
在bean创建后到销毁前做一些事情。
二、生命周期实例
在上面这个环境中来为BookDao添加生命周期的控制方法,具体的控制有两个阶段:
- bean创建之前,想要添加内容,比如用来初始化需要用到资源
- bean销毁之前,想要添加内容,比如用来释放用到的资源
我们重新搭建一个环境
- 创建一个Maven项目
- pom.xml添加依赖
- resources下添加spring的配置文件applicationContext.xml
配置好环境之后
生命周期设置
步骤1:添加初始化和销毁方法
public class BookDaoImpl implements BookDao {
@Override
public void save() {
System.out.println("book dao save~");
}
//表示bean初始化对应的操作
public void init(){
System.out.println("init..");
}
//表示bean销毁之前对应的操作
public void destory(){
System.out.println("destory..");
}
}
步骤二:配置生命周期
<bean id="bookDao" class="com.Impl.dao.BookDaoImpl"
init-method="init" destroy-method="destory"/>
注意:此时destory方法并不会执行。
- Spring的IOC容器是运行在JVM中
- 运行main方法后,JVM启动,Spring加载配置文件生成IOC容器,从容器获取bean对象,然后调方 法执行
- main方法执行完后,JVM退出,这个时候IOC容器中的bean还没有来得及销毁就已经结束了
- 所以没有调用对应的destroy方法
close关闭容器
close()方法
ApplicationContext中没有close方法
所以要将 ApplicationContext 更换为ClassPathXmlApplicationContext
ClassPathXmlApplicationContext ctx =
new ClassPathXmlApplicationContext("applicationContext.xml");
//调用ctx的close()方法
ctx.close();
除了上述方法外,我们还有一种方法也可以关闭容器
注册钩子关闭容器
- 在容器未关闭之前,提前设置好回调函数,让JVM在退出之前回调此函数来关闭容器
- 调用ctx的registerShutdownHook()方法
ctx.registerShutdownHook();
注意:registerShutdownHook在ApplicationContext中也没有
三、bean生命周期小结
(1).Spring中对bean生命周期控制提供了两种方式
- 在配置文件中的bean标签中添加init-method和destroy-method属性
- 类实现InitializingBean与DisposableBean接口,这种方式了解下即可
(2).对于bean的生命周期控制在bean的整个生命周期中所处的位置如下
初始化容器
- 创建对象(内存分配)
- 执行构造方法
- 执行属性注入(set操作)
- 执行bean初始化方法
使用bean
- 执行业务操作
关闭/销毁容器
关闭容器的两种方式:
- close()方法
- registerShutdownHook()方法