说明:
(1)本篇博客主要根据案例阐述对象的声明周期;
(2)其中,比较重要的是注意下这个对应关系:
(3)还有就是调用【registerShutdownHook()】销毁IoC容器;
目录
在Order类中添加destroy()方法,并设置的destroy-methd属性指向这个方法;
一:bean对象生命周期说明
bean的生命周期:
说明:
(1)第一步:【IoC容器准备初始化,解析applicationContext.xml文件】:先解析applicationContext.xml文件,看下当前xml中,需要创建哪些对象,需要为哪些对象注入什么属性。即,这一步,是先看看情况,确定要做什么;
(2)第二步:【对象实例化,执行构造方法】:IoC根据applicationContext.xml配置文件中的内容,自动利用反射技术,去实例化对应的bean对象;同时,基于java的规则,在实例化对应bean对象的时候,对应的构造方法也会执行。即,这一步,仅仅是得到了对象;
(3)第三步:【为对象注入属性】:当获取了对象后,根据解析applicationContext.xml文件,IoC容器会知道,要为刚创建的对象注入哪些属性,IoC容器完成对象属性注入的工作。即,这一步,是IoC容器确定,要为对象注入哪些属性,并给对象设置好这些属性;
(4)第四步:【调用init-method初始化方法】:当IoC容器为对象注入属性后,接下来IoC容器会自动的调用对象的init-method方法,来完成一些剩余的工作,彻底完成对象的初始化工作。即,这一步,是在对象注入属性之后,通过init-method()方法彻底完成对象的初始化工作;
(5)第五步:【IoC容器初始化完毕】:经过上面的步骤后,IoC容器的初始化工作就完成了;
(6)第六步:【执行业务代码】:当IoC容器初始化完成后,那些对象也都创建好了,就可以通过代码调用这些对象的业务代码了;
(7)第七步:【IoC容器准备销毁】:如果不想要IoC容器了,就可以调用对应的方法,去启动销毁IoC容器;
(8)第八步:【调用destroy-method方法,释放资源】:IoC容器开始销毁时,IoC容器就会调用配置文件中声明的destroy-method方法,去释放对应的资源;
(9)第九步:【IoC容器销毁完毕】:当所有bean对象的destroy-method()方法执行完后,IoC容器就销毁完毕了;
二:创建对象的演示
这儿代码,继续沿用【Spring IoC容器与Bean管理17:Bean对象的作用域及生命周期二:<bean>的scope属性的实际应用;(主要是【scope=singleton】和【scope=prototype】)】中的s06项目中的代码;
1.创建对象的过程
在readme.md中,增加一点项目说明:
创建entity包,添加Order类:
Order类:
package com.imooc.spring.ioc.entity; public class Order { private Float price;//单价 private Integer quantity;//采购数量 private Float total;//订单的总价 public void init() { System.out.println("执行了init()方法"); total = price * quantity; } /** * 支付方法 */ public void pay() { System.out.println("订单金额为:" + total); } public Order() { System.out.println("通过无参构造方法,创建Order对象" + this); } public Order(Float price, Integer quantity, Float total) { this.price = price; this.quantity = quantity; this.total = total; } public Float getPrice() { return price; } public void setPrice(Float price) { this.price = price; System.out.println("执行了setPrice()方法,去注入price属性;"); } public Integer getQuantity() { return quantity; } public void setQuantity(Integer quantity) { this.quantity = quantity; System.out.println("执行了setQuantity()方法,去注入Quantity属性;"); } public Float getTotal() { return total; } public void setTotal(Float total) { this.total = total; } }
说明:
(1)Order类添加了一个init()方法;这个init()方法,在下面介绍applicationContex.xml中的init-method属性时,会用得到;
(2)因为在后面applicationContext.xml中,是利用【setter方法完成对象的创建和注入】,所以,上面在对应的方法处都输出了一些提示性的文字;
applicationContext.xml:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="order1" class="com.imooc.spring.ioc.entity.Order" init-method="init"> <property name="price" value="19.8"/> <property name="quantity" value="1000"/> </bean> </beans>
说明:
(1)init-method="init":那么在IoC容器初始化的过程中,IoC容器会去调用Order类中的init()方法;
SpringApplication程序入口类:
package com.imooc.spring.ioc; import com.imooc.spring.ioc.dao.UserDao; import com.imooc.spring.ioc.entity.Order; import com.imooc.spring.ioc.service.UserService; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import sun.awt.IconInfo; public class SpringApplication { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml"); System.out.println("============IoC容器已经初始化============"); Order order1 = context.getBean("order1", Order.class); order1.pay(); } }
说明:
(1)运行结果:这个过程还是比较清晰的;
那么如果想要销毁这个容器嘞?
2.销毁IoC容器演示
在Order类中添加destroy()方法,并设置<bean>的destroy-methd属性指向这个方法;
说明:
(1)在销毁IoC容器的过程中,会执行<bean>的destroy-method属性对应的方法;
(2)Order类中的destroy()方法的作用是,在销毁IoC容器(也就是销毁对象)的时候,需要执行的一些代码,一般是释放与order1对象相关的资源;在程序运行中,所谓资源,可以是一个文件,也可以是一个网络的连接,也可以是其系统方法的调用;而,一般在实际开发中,我们要把释放这些资源的代码写在destroy()方法中;
(3)比如,在商品进入海关的时候,除了对这个订单进行申报,还需要将这个订单信息写入到某个文件中;如果在这个过程中出现了异常情况,此时IoC容器要进行销毁,那么此时就要触发order对象的destroy()方法,那么在这个destroy()方法中,我们就要编写代码,将这个正写入的文件进行保存的操作,并且将这个文件资源进行释放,这样的话才能在销毁IoC容器的时候,实现平稳销毁,不出乱子的效果;
SpringApplication程序入口类:
说明:
(1)【registerShutdownHook()】:销毁IoC容器的方法;这个方法不是在ApplicationContext接口中定义的,而是ClassPathXmlApplicationContext这个ApplicationContext接口的实现类中定义的;
(2)在调用【registerShutdownHook()】销毁IoC容器的过程中,会自动的调用在applicationContext.xml的<bean>中设置的destroy-medhod对应的方法;
(3)运行效果:可以看到,在调用【registerShutdownHook()】销毁IoC容器的过程中,自动的调用在applicationContext.xml的<bean>中设置的destroy-medhod对应的方法;
至此,一个对象的完整生命周期就完成了。