对象的生命周期

什么是对象的生命周期

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

为什么要学习对象的生命周期?
(由程序员控制的
创建对象 就使用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. GCC 连接器、链接标准库 gcc -l、链接手动创建库(指定目录的库 gcc -L)
  2. 怎么解决哈希冲突_从生日悖论谈哈希碰撞
  3. 这两天被木马程序搞得好烦
  4. codeforce 570 problem E 51Nod-1503-猪和回文
  5. OpenCV形态学变换函数morphologyEx()开运算的使用
  6. JBoss AS 7.0.2“ Arc”发布–使用绑定选项
  7. 【HDU - 5475】An easy problem(线段树,思维)
  8. LeetCode 1979. 找出数组的最大公约数
  9. 频繁模式增长Frequent-Pattern Growth(FP-Growth)
  10. php 读xml的两种方式
  11. 实体词典 情感词典_基于情感词典的情感分析
  12. win10远程控制+Android,win10实现手机远程控制电脑步骤分享
  13. springboot+vue实现excel导入-------去重
  14. echarts关系图(force图)
  15. App在后台被杀死后重启-重进首页方法
  16. 为什么微信小程序里的图片在电脑上显示在手机上不显示?
  17. WiFi流量劫持—— 浏览任意页面即可中毒!
  18. VSCode在打印输出sizeof()时的警告
  19. ucore_lab5实验报告
  20. 停止git上传_git – rebase正在进行中 不能提交如何进行或停止(中止)?

热门文章

  1. 三人表决器逻辑表达式与非_STEP7编程语言学习之STL语言的学习——一.位逻辑指令的学习...
  2. RBA验厂辅导,RBA认证7.0供应商行为准则中文版详细内容
  3. 空间调制(SM)代码实现
  4. python的制表符是什么,什么是python制表符
  5. 5-24 藏尾诗 (20分)
  6. CSS七种常用居中方式
  7. C++编程实现多显示器控制(复制、横屏、纵屏,显示器个数)等
  8. [蓝桥杯][算法提高VIP]阮小二买彩票
  9. Ubuntu下获取Android源码
  10. 二分查找的ASL公式及其数学推算