1. 什么是对象的⽣命周期
⽣命周期: 指的是⼀个对象创建、存活、消亡的⼀个完整过程
2. 为什么要学习对象的⽣命周期
由Spring负责对象的创建、存活、销毁,了解生命周期,有利于使用好Spring为我们创建对象
3. ⽣命周期的3个阶段
1.1 创建阶段
Spring工厂何时创建对象
- 当设置scope = "singleton"时
# Spring⼯⼚创建的同时,对象的创建
# 注意:如果设置scope = "singleton"这种情况下,也需要在获取对象的同时,创建对象,设置如下:
<bean id="xx" class="xx.xxx" scope="singleton" lazy-init="true"/>
- 当设置scope="prototype"时
# Spring⼯⼚会在获取对象(applicationContext.getBean("xxx"))的同时,才创建对象
注意:如果想在scope="singleton"模式下设置获取对象的同时创建对象需要设置lazy-init="true"
1.2 初始化阶段
Spring工厂会在创建完对象后,调用对象的初始化方法,完成对象相应的初始化操作
注意:
1、初始化方法提供:程序员根据需求,提供初始化方法,最终完成初始化操作
2、初始化方法调用:Spring工厂进行调用
- 方式一:实现InitializingBean接口实现它的方法
public class demo implements InitializingBean {
@Override
public void afterPropertiesSet() throws Exception {
// TODO 初始化操作
}
}
- 方式二:对象中提供一个普通方法,配置文件种配置init-method = "xxx"
# 方法名随便
public void init(){
// TODO 初始化操作
}
# applicationContext.xml:
# init-method的方法名由上面的方法提供
<bean id="prod" class="com.bearjun.factory.Product" init-method="init"/>
初始化操作的细节分析:
- 如果⼀个对象既实现InitializingBean同时⼜提供的普通的初始化方法,执行顺序?
先执行InitializingBean,再执行普通初始化方法。 - 注入⼀定发⽣在初始化操作的前面。
- 什么叫初始化操作?
资源的初始化:数据库、IO、网络、…
1.3 销毁阶段
Spring 销毁对象前,会调用对象的销毁方法,完成销毁操作。
注意:
1、Spring 什么时候销毁所创建的对象?
工厂关闭的时候 -> applicationContext.close();
2、销毁方法提供:程序员根据业务需求,定义销毁方法,完成销毁操作
销毁方法调用:Spring工厂进行调用。
- 方式一:实现DisposableBean
public class Product implements DisposableBean {
// 程序员根据⾃⼰的需求, 定义销毁方法, 完成销毁操作
@Override
public void destroy() throws Exception {
// TODO 销毁操作
}
}
- 方式二:定义一个方法,在配置文件中配置destroy-method=""
public class Product {
// 程序员根据⾃⼰的需求, 定义销毁方法, 完成销毁操作
public void myDestory() {
// TODO 销毁操作
}
}
# applicationContext.xml:
<bean id="product" class="com.bearjun.Product" destroy-method="myDestory"/>
销毁阶段细节分析:
- 销毁方法的操作只适用于scope="singleton",初始化操作都适用。
- 什么是销毁操作?
资源的释放:io.close()、connection.close()、…
4. 对象的生命周期总结
public class Product implements InitializingBean, DisposableBean {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
System.out.println("Product.setName");
this.name = name;
}
Product() { // 创建
System.out.println("Product.Product");
}
// 程序员根据需求实现的方法, 完成初始化操作
public void myInit() {
System.out.println("Product.myInit");
}
// 程序员根据需求实现的方法, 完成初始化操作
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("Product.afterPropertiesSet");
}
public void myDestory() {
System.out.println("Product.myDestory");
}
// 程序员根据⾃⼰的需求, 定义销毁方法, 完成销毁操作
@Override
public void destroy() throws Exception {
System.out.println("Product.destroy");
}
}
<bean id="product" class="com.bearjun.Product" init-method="myInit" destroy-method="myDestory">
<property name="name" value="bearjun"/>
</bean>
通过上述代码的演示,我们可以描绘出如下的图:
-
sping先调用构造方法,创建对象。如果scope="singleton",则工厂创建的时候,对象会被创建,scope="prototype",applicationContext获取的时候,spring才会创建对象。其次spring调用set注入,为属性赋值。
-
其次通过InitializingBean初始化的afterPropertiesSet方法
-
再然后通过配置init-method初始化的方法
-
如果scope="singleton"的话,工厂进行销毁操作applicationContext.close()
-
再然后通过DisposableBean销毁的destroy方法
-
最后通过配置destroy-method的销毁方法
评论区