Spring中bean的生命周期(易懂版)

109 阅读4分钟

bean的生命周期

写在前面的话

关于bean的生命周期有很多的文章,但是大多数都是长篇的理论,说来说去也不是很好理解,再次我就整理了一篇比较好理解的bean的生命周期,全文通过代码的形式形象的看到bean完整的生命周期,希望对你能有帮助!

bean的生命周期

生命周期是指:从对象创建到对象的销毁的过程。

bean的生命周期分为以下五步:
(1)通过构造器创建bean实例(调用无参的构造函数)
(2)为bean的属性设置值和对其它bean引用(调用set方法)
(3)调用bean的初始化方法(初始化方法需要配置)
(4)bean的使用(获取到对象)
(5)容器关闭,调用bean的销毁的方法(销毁方法需要进行配置)

代码演示

创建一个bean包用于演示bean的生命周期。
在bean包里创建一个Orders类演示使用。

Orders类:

package com.Keafmd.spring5.bean;

/**
 * Keafmd
 *
 * @ClassName: Orders
 * @Description: 演示bean生命周期
 * @author: 牛哄哄的柯南
 * @date: 2021-01-15 16:52
 */
public class Orders {

    private String oname;

    //无参的构造函数,为了看到调用构造函数的过程我们把这个无参的构造函数写出来
    public Orders() {
        System.out.println("第一步:执行无参构造。");
    }

	//set方法
    public void setOname(String oname) {
        this.oname = oname;
        System.out.println("第二步:调用set方法,设置属性值。");
    }

    //创建一个初始化的执行的方法
    public void initMethod(){
        System.out.println("第三步:执行初始化的方法。");
    }

    //创建一个销毁的执行的方法
    public void destoryMethod(){
        System.out.println("第五步:执行销毁的方法。");
    }



}

我们自己写的初始化方法和销毁方法只有配置后才会被bean识别为初始化化方法和销毁方法,在bean中这样配置:init-method="initMethod" destroy-method="destoryMethod"

完整的bean4.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 http://www.springframework.org/schema/beans/spring-beans.xsd">

	<!--进行配置-->
    <bean id="orders" class="com.Keafmd.spring5.bean.Orders" init-method="initMethod" destroy-method="destoryMethod">
        <property name="oname" value="手机"></property>
    </bean>

</beans>

写个测试代码展示bean的生命周期。

测试类TestSpring5demo1:

package com.Keafmd.spring5.testdemo;

import com.Keafmd.spring5.bean.Orders;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Keafmd
 *
 * @ClassName: TestSpring5demo1
 * @Description: 测试类
 * @author: 牛哄哄的柯南
 * @date: 2021-01-15 14:30
 */
public class TestSpring5demo1 {

    //演示生命周期
    @Test
    public void test4(){

        ApplicationContext context = new ClassPathXmlApplicationContext("bean4.xml");
        Orders orders = context.getBean("orders",Orders.class);
        System.out.println("第四步:获取创建bean实例对象。");
        //System.out.println(orders);
        
        //手动让bean的实例销毁
        ((ClassPathXmlApplicationContext)context).close();


    }
}

运行结果:

第一步:执行无参构造。
第二步:调用set方法,设置属性值。
第三步:执行初始化的方法。
第四步:获取创建bean实例对象。
第五步:执行销毁的方法。

Process finished with exit code 0

这就是bean的生命周期的五个步骤,但是bean还有跟完整的生命周期,就是加上bean的后置处理器的生命周期。总共会有七步,下面进行演示。

bean的更完整的生命周期

加上bean的后置处理器后bean的生命周期就变成了七步,多出来的两步分别是在执行初始化方法前和执行初始化方法后各多出一步。

bean的更完整的生命周期分为以下七步:
(1)通过构造器创建bean实例(调用无参的构造函数)
(2)为bean的属性设置值和对其它bean引用(调用set方法)
(3)把bean实例传递到bean后置处理器的方法
(4)调用bean的初始化方法(初始化方法需要配置)
(5)把bean实例传递到bean后置处理器的方法
(6)bean的使用(获取到对象)
(7)容器关闭,调用bean的销毁的方法(销毁方法需要进行配置)

添加后置处理器的代码演示

在上面代码的基础我们需要添加一个bean的后置处理器并且进行配置。
创建个MyBeanPost类实现BeanPostProcessor接口。

MyBeanPost:

package com.Keafmd.spring5.bean;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.lang.Nullable;

/**
 * Keafmd
 *
 * @ClassName: MyBeanPost
 * @Description: bean的后置处理器
 * @author: 牛哄哄的柯南
 * @date: 2021-01-15 17:47
 */
public class MyBeanPost implements BeanPostProcessor {

    @Nullable
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("第三步 Before...");
        return bean;
    }

    @Nullable
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("第三步 After...");
        return bean;
    }

}

配置bean的后置处理器。

bean4.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 http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="orders" class="com.Keafmd.spring5.bean.Orders" init-method="initMethod" destroy-method="destoryMethod">
        <property name="oname" value="手机"></property>
    </bean>

    <!--为当前所有的bean都加上了-->
    <!--配置后置处理器-->
    <bean id="myBeanPost" class="com.Keafmd.spring5.bean.MyBeanPost"></bean>

</beans>

同样的测试代码:
测试类TestSpring5demo1:

package com.Keafmd.spring5.testdemo;

import com.Keafmd.spring5.bean.Orders;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Keafmd
 *
 * @ClassName: TestSpring5demo1
 * @Description: 测试类
 * @author: 牛哄哄的柯南
 * @date: 2021-01-15 14:30
 */
public class TestSpring5demo1 {

    //演示生命周期
    @Test
    public void test4(){

        ApplicationContext context = new ClassPathXmlApplicationContext("bean4.xml");
        Orders orders = context.getBean("orders",Orders.class);
        System.out.println("第四步:获取创建bean实例对象。");
        //System.out.println(orders);
        
        //手动让bean的实例销毁
        ((ClassPathXmlApplicationContext)context).close();


    }
}

运行结果:

第一步:执行无参构造。
第二步:调用set方法,设置属性值。
第三步 Before...
第三步:执行初始化的方法。
第三步 After...
第四步:获取创建bean实例对象。
第五步:执行销毁的方法。

Process finished with exit code 0

以上就是关于bean生命周期的全部代码展示。

看完如果对你有帮助,感谢点赞支持!
如果你是电脑端的话,看到右下角的 “一键三连” 了吗,没错点它[哈哈]

在这里插入图片描述
加油!

共同努力!

Keafmd