侧边栏壁纸
  • 累计撰写 101 篇文章
  • 累计创建 89 个标签
  • 累计收到 9 条评论

spring系列笔记 - 第⼗章 对象的生命周期

bearjun
2020-12-20 / 0 评论 / 0 点赞 / 1,521 阅读 / 3,081 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2020-12-20,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

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"/>

初始化操作的细节分析:

  1. 如果⼀个对象既实现InitializingBean同时⼜提供的普通的初始化方法,执行顺序?
    先执行InitializingBean,再执行普通初始化方法。
  2. 注入⼀定发⽣在初始化操作的前面
  3. 什么叫初始化操作?
    资源的初始化:数据库、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"/>

销毁阶段细节分析:

  1. 销毁方法的操作只适用于scope="singleton",初始化操作都适用。
  2. 什么是销毁操作?
    资源的释放: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>

通过上述代码的演示,我们可以描绘出如下的图:
2020-06-23_101451.jpg

  • sping先调用构造方法,创建对象。如果scope="singleton",则工厂创建的时候,对象会被创建,scope="prototype",applicationContext获取的时候,spring才会创建对象。其次spring调用set注入,为属性赋值。

  • 其次通过InitializingBean初始化的afterPropertiesSet方法

  • 再然后通过配置init-method初始化的方法

  • 如果scope="singleton"的话,工厂进行销毁操作applicationContext.close()

  • 再然后通过DisposableBean销毁的destroy方法

  • 最后通过配置destroy-method的销毁方法

0

评论区