• 详解Spring中Bean的生命周期


    简述bean生命周期

    从对象创建到对象销毁的过程。Spring的IOC容器可以管理bean的生命周期,其允许在bean的生命周期的特定时间点执行相应的任务。

    bean的生命周期(不考虑bean的后置处理器)

    1. 通过构造器或工厂方法创建bean实例
    2. 为bean的属性设置值和对其它bean引用
    3. 调用bean的初始化方法
    4. 使用bean
    5. 当容器关闭时,调用bean的销毁方法

    举例演示bean的生命周期:

    创建的bean对象

    public class test {
        private String name;
    
        public test() {
            System.out.println("第一步 创建bean");
        }
    
        public void setName(String name) {
            this.name = name;
            System.out.println("第二步 设置属性值");
        }
    
        public void myInit() {
            System.out.println("第三步 bean被初始化");
        }
    
        public void myDestory() {
            System.out.println("第五步 bean被销毁");
        }
        
        public String getName() {
            return name;
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    配置文件

    <?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="test" class="cn.itcast.travel.domain.test" init-method="myInit" destroy-method="myDestory">
        <property name="name" value="张三"></property>
    </bean>
    </beans>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    运行

      @Test
      public void test(){
          ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
          test test = context.getBean("test", test.class);
          System.out.println("第四步 使用bean " +test.getName());
          context.close();
      }
    // 上述代码运行结果
    第一步 创建bean
    第二步 设置属性值
    第三步 bean被初始化
    第四步 使用bean张三
    第五步 bean被销毁
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    注意:单例bean和多实例的bean的创建时间是不同的,那么他们的初始方法和销毁方法的执行时间也稍微不同

    单例bean的生命周期

    1. 容器启动
    2. 初始化方法
    3. 容器关闭,销毁方法

    多例bean的生命周期

    1. 容器启动
    2. 调用bean
    3. 初始化方法
    4. 容器关闭(销毁方法不执行)

    上述未考虑bean的后置处理器,接下来加上bean的后置处理器

    什么是bean的后置处理器?

    bean的后置处理器允许在初始化方法执行前后对bean做额外的操作,bean的后置处理器对IOC容器中的所有bean实例逐一处理,而非单一处理。其典型应用是:检查bean属性的正确性或根据特定的标准更改bean的属性。

    生命周期

    a. 通过构造函数或工厂方法创建bean实例
    b. 为bean的属性设置值和对其它bean的引用
    c. 将bean实例传递给bean后置处理器的postProcessBeforeInitialization方法
    d. 调用bean的初始化方法
    e. 将bean实例传递给bean后置处理器的 postProcessAfterInitialization方法
    f. bean可以使用了
    g. 当容器关闭时调用bean的销毁方法

    举例:

    首先我们需要实现

    org.springframework.beans.factory.config.BeanPostProcessor

    接口并实现里面的两个方法。如下

    public class beanPostProcessor implements BeanPostProcessor {
        
          /**
         * 初始化方法执行前 执行
         * @param bean
         * @param beanName
         * @return
         * @throws BeansException
         */
        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            System.out.println("bean的后置处理器 初始化方法执行前---");
            return null;
        }
    
        /**
         * 初始化方法执行后 执行
         * @param bean
         * @param beanName
         * @return
         * @throws BeansException
         */
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            System.out.println("bean的后置处理器 初始化方法执行后---");
            return null;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    注册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"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
        
      <bean id="test" class="cn.itcast.travel.domain.test" init-method="myInit" destroy-method="myDestory">
            <property name="name" value="张三"></property>
      </bean>
        // bean的后置处理器
      <bean id="beanPostProcessor" class="cn.itcast.travel.domain.test1"></bean>
    
    </beans>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    运行,从结果我们可以看出bean生命周期的过程

      @Test
      public void test(){
          ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
          test test = context.getBean("test", test.class);
          System.out.println("第四步 使用bean " +test.getName());
          context.close();
      }
    // 以下是执行结果
    第一步 创建bean
    第二步 设置属性值
    bean的后置处理器 初始化方法执行前---
    第三步 bean被初始化
    bean的后置处理器houzhichui 初始化方法执行后---
    第四步 使用bean 张三
    第五步 bean被销毁
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    参考:详解Spring中Bean的作用域与生命周期

  • 相关阅读:
    Java并发编程 | 从进程、线程到并发问题实例解决
    字符串基本操作(HNU)
    基于JAVA智慧物业管理系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署
    [计算机毕业设计]基于SM9的密钥交换方案的实现与应用
    【论文阅读】VulCNN受图像启发的可扩展漏洞检测系统
    SSM+阳光大学宿舍管理系统 毕业设计-附源码211714
    3. JVM-运行时数据区概述及线程
    JS 是怎样运行起来的
    如何通过链路追踪进行定时任务诊断
    深入理解前端字节二进制知识以及相关API
  • 原文地址:https://blog.csdn.net/A798194701/article/details/125504820