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>

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

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);
    }
}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值