Spring IoC容器与Bean管理18:Bean对象的作用域及生命周期三:对象生命周期;

本文详细介绍了Spring IoC容器中Bean的生命周期,包括从IoC容器初始化、对象实例化、属性注入、初始化方法调用,直到业务代码执行、容器销毁以及销毁方法的调用。通过示例代码展示了如何在XML配置中使用`init-method`和`destroy-method`属性,并解释了在容器关闭时调用`registerShutdownHook()`销毁IoC容器并执行对象的销毁方法的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说明:

(1)本篇博客主要根据案例阐述对象的声明周期;

(2)其中,比较重要的是注意下这个对应关系:

(3)还有就是调用【registerShutdownHook()】销毁IoC容器;

目录

一:bean对象生命周期说明 

bean的生命周期:

二:创建对象的演示 

1.创建对象的过程

在readme.md中,增加一点项目说明: 

创建entity包,添加Order类: 

applicationContext.xml:

SpringApplication程序入口类:

2.销毁IoC容器演示

在Order类中添加destroy()方法,并设置的destroy-methd属性指向这个方法; 

SpringApplication程序入口类:


一: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对应的方法;

至此,一个对象的完整生命周期就完成了。


三:补充(尚未细究…………

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值