文章目录
一、生命周期
什么是对象的生命周期?
- ⼀个对象创建、存活、消亡的⼀个完整过程。
为什么要学习对象的生命周期?
- 由 Spring 负责对象的创建、存活、销毁,了解生命周期,有利于我们使用好 Spring 为我们创建的对象。
生命周期的 3 个阶段:
- 创建阶段 —> 初始化阶段 —> 销毁阶段
二、创建阶段
Spring 工厂何时创建对象?
当scope="singleton"
:表示只创建一个对象(单例),Spring 工厂(IoC 容器)创建的同时,创建对象。
当scope="prototype"
:Spring 工厂在获取对象 ctx.getBean("xxx")
的同时,创建对象。
通过配置 也可以实现工厂获取对象的同时,创建对象。
三、初始化阶段
Spring 工厂在创建完对象后,调用对象的初始化方法,完成对应的初始化操作。
初始化方法提供:程序员根据需求,提供初始化方法,最终完成初始化操作。
初始化方法调用:Spring 工厂进行调用。
提供初始化方法的两种方式:
3.1 InitializingBean接口
实现InitializingBean
接口,重写afterPropertiesSet()
方法:
public class Product implements InitializingBean {
//程序员根据需求实现的方法, 完成初始化操作
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("Product.afterPropertiesSet");
}
}
3.2 配置init-method
对象中提供一个普通的初始化方法,配置文件种配置 init-method
:
public class Product {
public void myInit() {
System.out.println("Product.myInit");
}
}
<bean id="product" class="com.zqc.Product" init-method="myInit"/>
3.3 分析
如果⼀个对象实现 InitializingBean接口又提供的普通的初始化方法,执行顺序?
-
先执行 InitializingBean,再执行普通初始化方法。
-
注入⼀定发生在初始化操作的前面。
初始化操作到底是什么?
- 资源的初始化:数据库、IO、网络、…
四、销毁阶段
Spring 销毁对象前,会调用对象的销毁方法,完成销毁操作。
Spring 什么时候销毁所创建的对象?ctx.close();
销毁方法提供:程序员根据业务需求,定义销毁方法,完成销毁操作
销毁方法调用:Spring 工厂进行调用。
销毁方法的操作只适用于 scope="singleton"
,初始化操作都适用。
销毁操作到底是什么?
资源的释放:io.close()、connection.close()、…
开发流程与初始化操作一样,提供销毁方法的两种方式:
4.1 DisposableBean 接口:
实现DisposableBean
接口,重写destroy()
方法:
public class Product implements DisposableBean {
// 程序员根据自己的需求, 定义销毁方法, 完成销毁操作
@Override
public void destroy() throws Exception {
System.out.println("Product.destroy");
}
}
4.2 配置 destroy-method
对象中提供一个普通的销毁方法,配置文件种配置destroy-method
:
public class Product {
// 程序员根据自己的需求, 定义销毁方法, 完成销毁操作
public void myDestory() {
System.out.println("Product.myDestory");
}
}
<bean id="product" class="com.zqc.Product" destroy-method="myDestory"/>
五、总结
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.zqc.Product" init-method="myInit" destroy-method="myDestory">
<property name="name" value="zqc"/>
</bean>
在Spring工厂创建完毕后
- Spring通过构造方法创建对象,注意,如果是单例对象(scope=singleton),那么该对象在工程创建的同时也完成了创建;如果非单例对象(scope=prototype),会通过
ctx.getBean("xx")
方法创建对象。 - 初始化阶段:会执行实现了
InitializingBean
接口并重写的afterPropertiesSet
方法。 - 初始化阶段:根据配置文件中
init-method
的设置,执行自定义的初始化方法。 - 销毁阶段:会执行实现了
DIsposableBean
接口并重写的destory
方法。 - 销毁阶段:根据配置文件中
destroy-method
的设置,执行自定义的销毁方法。