• Spring中Bean的生命周期浅析


    在这里插入图片描述
    1、实例化bean对象

    ​ 通过反射的方式进行对象的创建,此时的创建只是在堆空间中申请空间,属性都是默认值

    2、设置对象属性

    ​ 给对象中的属性进行值的设置工作

    3、检查Aware相关接口并设置相关依赖

    ​ 如果对象中需要引用容器内部的对象,那么需要调用aware接口的子类方法来进行统一的设置

    4、BeanPostProcessor的前置处理

    ​ 对生成的bean对象进行前置的处理工作

    5、检查是否是InitializingBean的子类来决定是否调用afterPropertiesSet方法

    ​ 判断当前bean对象是否设置了InitializingBean接口,然后进行属性的设置等基本工作

    6、检查是否配置有自定义的init-method方法

    如果当前bean对象定义了初始化方法,那么在此处调用初始化方法

    7、BeanPostProcessor后置处理

    ​ 对生成的bean对象进行后置的处理工作

    8、注册必要的Destruction相关回调接口

    ​ 为了方便对象的销毁,在此处调用注销的回调接口,方便对象进行销毁操作

    9、获取并使用bean对象

    通过容器来获取对象并进行使用

    10、是否实现DisposableBean接口

    ​ 判断是否实现了DisposableBean接口,并调用具体的方法来进行对象的销毁工作

    11、是否配置有自定义的destory方法

    如果当前bean对象定义了销毁方法,那么在此处调用销毁方法

    public class BeanLifeCycleDemo {
    
        public BeanLifeCycleDemo() {
            System.out.println("第一步:调用无参构造器构建实例");
        }
    
        String a;
        public void setA(String a) {
            this.a = a;
            System.out.println("第二步:调用Setter方法注入属性配置依赖");
        }
    
        public void initMethod() {
            System.out.println("第三步:调用自定义初始化方法");
        }
    
        public void destroyMethod() {
            System.out.println("第五步:调用自定义销毁方法");
        }
    
        @Override
        public String toString() {
            System.out.println("第四步:获取创建的实例对象并使用...");
            return "A{" +
                    "a='" + a + '\'' +
                    '}';
        }
    
        @Test
        public void test01() {
            ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
            BeanLifeCycleDemo myBean = context.getBean("myBean", BeanLifeCycleDemo.class);
            System.out.println(myBean);
            // 手动调用删除方法
            ((ClassPathXmlApplicationContext) context).close();
        }
    
    }
    
    
        <bean id="A" name="myBean" class="com.example.springdemo.BeanLifeCycleDemo" init-method="initMethod" destroy-method="destroyMethod">
            <property name="a" value="测试"></property>
        </bean>
    
    
    • 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
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    运行结果:
    在这里插入图片描述
    更加详细的:
    加入初始化前的前置处理和后置处理

    public class BeanPostHandler implements BeanPostProcessor {
        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            System.out.println("初始化Bean之前调用:" + beanName);
            return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);
        }
    
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            System.out.println("初始化Bean之后调用:" + beanName);
            return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    运行结果如下:
    在这里插入图片描述

  • 相关阅读:
    设计模式中的七大原则
    C++类和对象【上】
    Bean Validation(数据校验注解大全 @Valid和@Validated的区别。
    国产芯片频频突破!中国“芯“引发全球关注,美媒彻底慌了
    Android-Service详解
    Chrome Extension 介绍
    Elastic 8.15:更好的语义搜索、新的 OTel 分布、SIEM 数据导入
    【scikit-learn基础】--『监督学习』之 决策树回归
    uni-app实现获取未来七天时间和星期几功能
    LLM 时代,如何优雅地训练大模型?
  • 原文地址:https://blog.csdn.net/Lionel_SSL/article/details/126776328