Spring Bean的生命周期 五步 七步 十步 循序渐进

👨‍🏫 参考视频地址

在这里插入图片描述
在这里插入图片描述

💖 五步版

  1. 实例化 bean(构造方法)
  2. 属性注入(set() 方法)
  3. 初始化方法(自定义)
  4. 使用bean
  5. 销毁方法(自定义)

💖 七步版

  1. 实例化 bean(构造方法)
  2. 属性注入(set() 方法)
  3. bean后置处理器的前置方法执行…postProcessBeforeInitialization()
  4. 初始化方法(自定义)
  5. bean后置处理器的后置方法执行…postProcessAfterInitialization()
  6. 使用bean
  7. 销毁方法(自定义)

💖 十步版

  1. 实例化 bean(构造方法)

    • AbstractAutowireCapableBeanFactory类中的createBeanInstance方法中实现
  2. 属性注入(set() 方法)

    • AbstractAutowireCapableBeanFactorypopulateBean方法中处理
  3. Aware接口

    • AbstractAutowireCapableBeanFactoryinitializeBean方法中调用
  4. bean后置处理器的前置方法执行…(postProcessBeforeInitialization()

    • AbstractAutowireCapableBeanFactoryapplyBeanPostProcessorsBeforeInitialization方法执行。
  5. InitializingBean接口afterPropertiesSet()

    • 提供一个机会,在所有Bean属性设置完成后进行初始化操作
    • AbstractAutowireCapableBeanFactoryinvokeInitMethods方法中调用。
  6. 初始化方法(自定义)

    • AbstractAutowireCapableBeanFactoryinvokeInitMethods方法中调用。
  7. bean后置处理器的后置方法执行…(postProcessAfterInitialization()

    • 注册Destruction回调:如果Bean实现了DisposableBean接口或在Bean定义中指定了自定义的销毁方法,Spring容器会为这些Bean注册一个销毁回调,确保在容器关闭时能够正确地清理资源。
    • AbstractAutowireCapableBeanFactoryapplyBeanPostProcessorsAfterInitialization方法执行
  8. 使用bean

  9. DisposableBean接口(销毁前调用方法 destroy()

    • 当容器关闭时,如果Bean实现了DisposableBean接口,destroy方法会被调用。
    • DisposableBeanAdapterdestroy方法中实现
  10. 销毁方法(自定义)

    • DisposableBeanAdapterdestroy方法中实现

整个 Bean 的创建过程都依赖于 AbstractAutowireCapatableBeanFactory 这个类,而销毁Bean主要依赖 DisposableBeanAdapter 这个类。


🌟 测试代码

在这里插入图片描述

⭐ User

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.config.BeanPostProcessor;


/**
 * @author : lighting
 */
public class User implements BeanFactoryAware, InitializingBean, DisposableBean {
    String name;


    public User() {
        System.out.println("1. 实例化 bean");
    }

    public User(String name) {
        this.name = name;
    }



    public void setName(String name) {
        System.out.println("2. 属性注入");
        this.name = name;
    }
    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("    ③ Aware接口");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("    ⑤ InitializingBean接口");
    }

    void myInit(){
        System.out.println("7. 初始化方法");
    }

    public String getName() {
        System.out.println("8. 使用bean");
        return name;
    }
    @Override
    public void destroy() throws Exception {
        System.out.println("    ⑨ DisposableBean接口");
    }
    void myDestroy(){
        System.out.println("10. 销毁方法");
    }
}
class MyProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if("user".equals(beanName))
            System.out.println("  4) bean后置处理器的前置方法执行...");
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if("user".equals(beanName))
            System.out.println("  6) bean后置处理器的后置方法执行...");
        return bean;
    }
}

⭐ spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       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-4.0.xsd
             http://www.springframework.org/schema/context
             http://www.springframework.org/schema/context/spring-context-4.0.xsd
              ">

    <bean id="user" class="com.lighting.bean.User" 
          init-method="myInit" 
          destroy-method="myDestroy">
        <property name="name" value="李白"></property>
    </bean>

    <bean id="processor" class="com.lighting.bean.MyProcessor">
    </bean>
</beans>

✨ 运行结果

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值