文章目录
一、生命周期
什么是对象的生命周期?
- ⼀个对象创建、存活、消亡的⼀个完整过程。
为什么要学习对象的生命周期?
- 由 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的设置,执行自定义的销毁方法。

本文详细阐述了Spring框架中对象的创建、初始化和销毁阶段,介绍了InitializingBean和DisposableBean接口的应用,以及如何通过配置方法控制初始化和销毁操作。重点讲解了单例与原型对象的区别以及初始化和销毁操作的执行顺序。
&spm=1001.2101.3001.5002&articleId=120233469&d=1&t=3&u=7ecc18b0a5b9468b90ae9234edd07232)
1775

被折叠的 条评论
为什么被折叠?



