Spring IOC中bean的生命周期

  • Post author:
  • Post category:其他


bean的生命周期(共7步)


    1. 通过构造器创建bean实例(无参数构造)

    2. 为bean的属性设置值和对其他bean引用(调用set方法)

    3. 把bean实例传递bean后置处理器的方法 postProcessBeforeInitialization()

    4. 调用bean的初始化的方法(需要进行配置初始化的方法)

    5. 把bean实例传递bean后置处理器的方法 postProcessAfterInitialization()

    6. bean可以使用了(对象获取到了)

    7. 当容器关闭的时候,调用bean的销毁方法(需要进行配置销毁的方法)


目录


1、首先创建一个Orders类


2、创建spring配置文件bean3.xml


3、创建后置处理器类MyBeanProcessor实现 BeanPostProcessor 接口


4、编写测试类实现测试


5、得到测试打印结果


6、总结


先看下目录结构:(其中马赛克打掉的部分都是没有用的类)

bean 的生命周期为上面的7步,接下来将演示整体的加载步骤:

1、首先创建一个Orders类

在该类中是用sout输出打印执行的顺序

package bean;

/**
 * @Author 不要有情绪的  ljy
 * @Date 2022/9/14 14:58
 * @Description:
 */
public class Orders {
    private String name;

    public Orders() {
        System.out.println("第一步: 创建实例");
    }

    public void setName(String name) {
        this.name = name;
        System.out.println("第二步: 通过set方法注入属性");
    }

    public void initMethod(){
        System.out.println("第三步: 已经开始初始化方法了");
    }


    public void destroyMethod(){
        System.out.println("第五步: 已经开始初始化方法了");
    }
}

2、创建spring配置文件bean3.xml

在配置文件里记得要配置后置处理器类,记住spring容器中所有操作都离不开bean的实例化,即<bean>标签的使用

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="order1" class="bean.Orders" init-method="initMethod" destroy-method="destroyMethod">
        <property name="name" value="衣服"></property>
    </bean>

    <!--配置后置处理器-->
    <bean id="myProcessBean" class="bean.MyProcessBean"></bean>


</beans>

3、创建后置处理器类MyBeanProcessor实现 BeanPostProcessor 接口

package bean;

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

/**
 * @Author 不要有情绪的  ljy
 * @Date 2022/9/14 15:47
 * @Description:
 */
public class MyProcessBean implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("   在初始化之前执行的方法");
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("   在初始化之后执行的方法");
        return bean;
    }
}

4、编写测试类实现测试

@Test
    public void test4(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bean3.xml");
        Orders order1 = context.getBean("order1", Orders.class);
        System.out.println("第四步: 获取创建bean实例对象");
        System.out.println(order1);
        //这儿要手动销毁对象实例
        ((ClassPathXmlApplicationContext) context).close();

    }

5、得到测试打印结果

"C:\Program Files\Java\jdk1.8.0_341\bin\java.exe" -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:E:\idea\IntelliJ IDEA 2020.2.4\lib\idea_rt.jar=59584:E:\idea\IntelliJ IDEA 2020.2.4\bin" -Dfile.encoding=UTF-8 -classpath "E:\idea\IntelliJ IDEA 2020.2.4\lib\idea_rt.jar;E:\idea\IntelliJ IDEA 2020.2.4\plugins\junit\lib\junit5-rt.jar;E:\idea\IntelliJ IDEA 2020.2.4\plugins\junit\lib\junit-rt.jar;C:\Program Files\Java\jdk1.8.0_341\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_341\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_341\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_341\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_341\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_341\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_341\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_341\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_341\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_341\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_341\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_341\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_341\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_341\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_341\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_341\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_341\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_341\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_341\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_341\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_341\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_341\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_341\jre\lib\rt.jar;D:\ajavaproject\coding\learnForSpring5\target\classes;C:\Users\qrs-ljy\.m2\repository\junit\junit\4.12\junit-4.12.jar;C:\Users\qrs-ljy\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;C:\Users\qrs-ljy\.m2\repository\org\springframework\spring-context\5.3.22\spring-context-5.3.22.jar;C:\Users\qrs-ljy\.m2\repository\org\springframework\spring-aop\5.3.22\spring-aop-5.3.22.jar;C:\Users\qrs-ljy\.m2\repository\org\springframework\spring-beans\5.3.22\spring-beans-5.3.22.jar;C:\Users\qrs-ljy\.m2\repository\org\springframework\spring-core\5.3.22\spring-core-5.3.22.jar;C:\Users\qrs-ljy\.m2\repository\org\springframework\spring-jcl\5.3.22\spring-jcl-5.3.22.jar;C:\Users\qrs-ljy\.m2\repository\org\springframework\spring-expression\5.3.22\spring-expression-5.3.22.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 test.TestSpring5,test4
第一步: 创建实例
第二步: 通过set方法注入属性
在初始化之前执行的方法
第三步: 已经开始初始化方法了
在初始化之后执行的方法
第四步: 获取创建bean实例对象
bean.Orders@43738a82
第五步: 已经开始初始化方法了

Process finished with exit code 0

6、总结

整体的加载过程为:

首先测试类通过测试方法加载xml配置文件,得到相应Bean,读取xml文件后,首先使用无参构造器创建实例,然后使用set方法设置参数的数值,然后执行后置处理器的

postProcessBeforeInitialization()

方法,然后开始初始化对象,再执行后置处理器的

postProcessAfterInitialization()

方法,在测试类中得到Bean对象,然后销毁对象实例(在销毁对象实例的方法中要手动销毁,才会调用destroy-method()方法)。

记得要在xml文件中配置 init-method()方法 和 destroy-method()方法

万物明朗,可可爱爱!

愿你天天有个好心情,热爱每一段代码!

ଘ(੭ˊᵕˋ)੭ (开心) ଘ(੭ˊᵕˋ)੭ (开心)ଘ(੭ˊᵕˋ)੭ (开心)ଘ(੭ˊᵕˋ)੭ (开心)ଘ(੭ˊᵕˋ)੭ (开心)

——不写代码不会凸的小刘



版权声明:本文为qq_40834643原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。