对象的生命周期

什么是对象的生命周期

  • 一个对象的创建、存活、消亡的一个完整过程。

为什么要学习对象的生命周期?
(由程序员控制的
创建对象 就使用new,User user = new User()
若一直有被引用,那么他就一直存活在虚拟机内存中,直到被虚拟机(JVM) 垃圾回收(GC)
销毁:虚拟机内存不够 或者进程结束,对象自然就消亡了)

  • Spring中, 由Spring负责对象的创建、存活、销毁,了解生命周期,有利于为我们创建对象。

生命周期的三个阶段

创建阶段

  • Spring 工厂何时创建对象?
    (1)scope=“singleton” Spring工厂创建的同时,对象的创建
package com.life;public class Product {public Product() {//为了验证什么时候创建对象,这里在无参构造力输出打印,方便验证System.out.println("Product.product");}
}
<bean id="product" scope="singleton" class="com.life.Product"></bean>

测试(1):

@org.junit.Test
public void Test6(){//获取工厂ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");
}
//output
//Product.product

注意:这种情况也许在获取对象的同时创建对象,则需要在bean里加lazy-init标签, 如下

<bean id="product" scope="singleton" class="com.life.Product" lazy-init="true"></bean>

若此时用测试(1)的代码测试,不会有输出。

(2)scope="prototype"
Spring 工厂会在获取对象的同时,创建对象
ctx.getBean();在这执行这句话的时候创建。

要先创建工厂,需要对象的时候再创建对象

<bean id="product" scope="prototype" class="com.life.Product"></bean>

测试(2)

@org.junit.Test
public void Test6(){//获取工厂ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");//创建对象Product product = (Product) ctx.getBean("product");
}
//output
//Product.product

注意 scope=“singleton”的标签若想大到与测试(2)一样的效果, 在bean里加lazy-init标签即可。

初始化阶段

Spring工厂在创建完对象后,调用对象的初始化方法,完成对应的初始化操作

  • 初始化方法提供: 程序员根据需求,提供初始化方法,最终完成初始化操作
  • 初始化方法调用: Spring工厂进行调用

初始化定义的两种方式
(1)实现InitializingBean接口
(2)在对象中提供一个普通的方法

  1. 实现InitializingBean接口,(藕合)
    完成afterPropertiesSet初始化方法,Spring会调用
//默认singleton,创建工厂的同时创建对象
<bean id="product" class="com.life.Product"></bean>
public class Product implements InitializingBean {public Product() {System.out.println("Product.product");}//这就是初始化方法,程序员根据需求,在里面做初始化操作@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("Product.afterPropertiesSet");}
}

测试
创建对象 那一行 被屏蔽,是因为singleton设置,即创建工厂的同时已经创建了对象,这里没必要再写一次。
结果输出了Spring初始化的值,即证明了完成对象的创建后,Spring会自动调用初始化方法。

@org.junit.Test
public void Test6(){//获取工厂ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");
//        //创建对象
//        Product product = (Product) ctx.getBean("product");}
//output
//Product.product
//Product.afterPropertiesSet
  1. 在对象中提供一个普通的方法,

自己创建一个初始化方法,那么Spring怎么会知道呢,所以方法名需要告诉Spring,即在配置文件中配置

<bean id="product" class="com.life.Product" init-method="myInit"/>
public void myInit(){System.outprintln(Product.myInit)
}

小结:

  1. 提供接口,接口是Spring自己定义的,不需要增加额外配置
package com.life;import org.springframework.beans.factory.InitializingBean;//1. 提供接口,接口是Spring自己定义的,不需要增加额外配置
public class Product implements InitializingBean {public Product() {System.out.println("Product.product");}//这就是初始化方法,在里面做初始化操作//Spring会调用@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("Product.afterPropertiesSet");}
}
  1. 提供普通方法,不藕合Spring框架,不用实现规定的接口。
    但是 需要增加配置 init-method 需要告诉Spring初始化方法
//2. 提供普通方法,不藕合Spring框架,不用实现规定的接口
// 但是 需要增加配置 init-method 需要告诉Spring初始化方法
public class Product{public Product() {System.out.println("Product.product");}public void myInit(){System.out.println("Product.myInit");}
}

细节分析
(1)如果一个对象即实现了initializingBean接口,又提供普通的初始化方法,那么它调用的顺序是什么?
回答:都会执行,先执行initializingBean,后执行普通初始化。
(2)注入发生在初始化之前
若类中有自己的属性,然后有各自的set get 方法,然后就有set 注入。顺序:先创建对象 - DI - 初始化
(3)什么叫初始化操作?
一般是对资源的初始化。资源如 数据库,IO 网络… 这些都比较耗资源,一般放在初始化中。

销毁阶段

Spring 销毁对象前,会调用对象的销毁方法,完成销毁。

  1. 什么时候销毁所创建的对象?
    工厂关闭的时候销毁,关闭前会调用销毁方法。
    ctx.close();
  • 销毁方法:程序员根据自己的需求,定义销毁方法,完成销毁操作。
  • 调用: 是由Spring工厂完成调用
  1. 怎么来定义销毁方法?

(1) 实现DisposableBean接口方法
(2) 定义普通方法,配置文件中配置destroy-method="myDestroy",和初始化类似。

package com.life;import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;//1. 提供接口,接口是Spring自己定义的,不需要增加额外配置
public class Product implements InitializingBean, DisposableBean {public Product() {System.out.println("Product.product");}...//1. 实现DisposableBean接口里的destroy方法即可@Overridepublic void destroy() throws Exception {System.out.println("Product.destroy");}//2. 定义普通方法,记得配置文件需要配置告知Spring这是destroypublic void myDestroy(){System.out.println("Product.myDestroy");}//<bean id="product" class="com.life.Product" destroy-method="myDestroy"></bean>
}

总结

  • 销毁方法只适用与scope=singleton 的配置,若是scope=prototype ,工厂关闭但是方法并没有销毁。
  • 什么是销毁操作?
    主要指资源的释放,比如 io.close(), connection.close()

    ---- 这个是孙帅老师的课件图,非常厉害

信息量太大,放开手机
静下心 学习
开心哦
“If you don’t prioritize your life, someone else will.”
– Greg McKeown

Spring学习笔记09 - 对象的生命周期相关推荐

  1. Mini 容器学习笔记4——组件的生命周期(应用篇)

    Mini容器支持6中生命周期类型: 1. Singleton :单利类型(缺省组件都是单利类型的生命周期,由容器进行托管的) [Test]public void SingletonLifestyleT ...

  2. 安卓学习笔记06:Activity生命周期与启动模式

    文章目录 零.学习目标 一.Activity生命周期 1.了解Activity生命周期 2.Activity生命周期简化图 (1)Activity存在与否 (2)Activity可见与否 (3)Act ...

  3. Spring学习总结1——bean的生命周期

    为什么80%的码农都做不了架构师?>>>    Spring实际上是一个容器框架,可以配置各种bean(action/service/domain/dao...),并且可以维护bea ...

  4. react学习笔记(4)组件的生命周期(运行阶段和销毁阶段)以及事件处理函数

    1.组件的生命周期 接着(2)中的组件生命周期 1.运行阶段 运行阶段有5个步骤: componentWillReceiveProps: 父组件修改属性触发,可以修改新属性,修改状态. shouldC ...

  5. 学习笔记--asp.net页生命周期(转自msdn,仅为自己学习存储和有意读者使用)

    ASP.NET 页生命周期概述 .NET Framework 4 其他版本 28(共 30)对本文的评价是有帮助 - 评价此主题 更新:2011 年 5 月 ASP.NET 页运行时,此页将经历一个生 ...

  6. AspectJ 学习笔记:Aspect的生命周期

    默认的情况下,Aspect类只有一个实例存在于虚拟机中,也就是作为单例存在的,对于每个对象来说,方面是共享的.一般这样的方面,不能用来保存相应对象的状态.    对于AspectJ 来说,Aspect ...

  7. 好记性不如烂笔杆-android学习笔记二 Acitvity lifecycle 生命周期

    7,//Acitvity lifecycle 生命周期 /** *1,一个Activity就是一个类,并且这个类要继承Activity *2,复写onCreate方法 *3,每个Activity需要在 ...

  8. 软件测试基础课程学习笔记2--贯穿软件生命周期的测试活动

    (1) 软件生存周期:开发文档下载 软件生命周期一般包括以下阶段:软件计划与可行性研究(问题定义.可行性研究).需求分析.软件设计(概要设计与详细设计).编码.软件测试.运行与维护 (2) 软件测试的 ...

  9. Android(java)学习笔记114:Service生命周期

    1.Service的生命周期         Android中的Service(服务)与Activity不同,它是不能和用户交互,不能自己启动的,运行在后台的程序,如果我们退出应用的时候,Servic ...

最新文章

  1. oc之Mac-响应链(Responder Chain)
  2. Vue系列之搭建环境
  3. 计组_IEEE754_练习题
  4. ASP.NET MVC3官方示例Music Store(音乐商店) --简易中文教程
  5. feign扫描_微服务实战SpringCloud之Feign简介及使用
  6. java俄罗斯方块论文,java俄罗斯方块论文
  7. 服务器PHPWAMP_IN2安装redis
  8. 流体力学有限元法(一)
  9. C++运算符过载详解
  10. 运算放大器节点电压方程_比例运算放大器电路
  11. React18 tearing tree issue 撕裂状态问题
  12. bandizip没有右键菜单解决办法
  13. mac中实用的录音软件有哪些?
  14. 2012-11-26四六级词汇#9317;-----…
  15. c语言程序女设计教学效果分析,提高C程序设计教学效果的策略
  16. 从ChatGPT的火爆回忆6年前的硅谷之行
  17. linux m2硬盘驱动,Linux R720挂载M.2固态硬盘
  18. FC模拟器网页版 小霸王游戏机,魂斗罗 源码
  19. idea 调节背景护眼_我的护眼神器:电子墨水显示器_原创
  20. JavaScript基础知识点复习

热门文章

  1. Windows10和Ubuntu双系统安装与配置
  2. 一读一写无锁队列c++实现
  3. ICloud没有密码怎么注销?
  4. 集成百度离在线语音唤醒/语音合成sdk
  5. java之数据管理系统软件
  6. Mac OS X上下载安装和配置hadoop指南
  7. 判断某个月的每一天是否为工作日
  8. 钉钉的想象力,向企业服务第一平台进阶
  9. 地理信息系统概论(陈述彭版)
  10. 如何只用CSS做到完全居中