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() 方法)

    • 在 AbstractAutowireCapableBeanFactory 的populateBean方法中处理
  3. Aware接口

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

    • 由AbstractAutowireCapableBeanFactory的applyBeanPostProcessorsBeforeInitialization方法执行。
  5. InitializingBean接口(afterPropertiesSet()

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

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

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

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

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

    • 在DisposableBeanAdapter的destroy方法中实现

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


🌟 测试代码

⭐ User

java 复制代码
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

java 复制代码
<?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>

✨ 运行结果

相关推荐
罗超驿26 分钟前
6.Java LinkedList深度解析:从链表原理到源码实践
java·开发语言·链表
2501_9481069128 分钟前
计算机毕业设计之jsp物业管理系统
java·大数据·开发语言·汽车·课程设计
非典型Android程序员34 分钟前
Launcher学习总结
android
黑taoA36 分钟前
深度解析:Maven核心命令(clean、compile、package、install)与IDEA多模块项目避坑指南
java·maven·intellij-idea
TDengine (老段)37 分钟前
TDengine 索引使用指南 — 何时建、怎么建、怎么用
java·大数据·数据库·物联网·时序数据库·tdengine·涛思数据
xlxxy_1 小时前
sap获取批次特性报表
java·linux·开发语言·前端·数据库·abap·mm
栋***t1 小时前
从“工具”到“基建”,麦塔在线考试系统经历的时代变局与定位逻辑
java·大数据·数据库·开源软件·无纸化
欢喜躲在眉梢里1 小时前
用飞算Java做了一套新能源充电运营管理系统:把站点、设备、订单拆成可运营的微服务
java·开发语言·微服务·ai编程·技术分享·java开发·飞算javaai炫技赛
Coffeeee1 小时前
Android功耗优化,哪些代码会让你的机子发热又耗电
android·架构·kotlin
薛定猫AI1 小时前
【技术干货】大模型文档结构化提取实战:Python解析PDF发票并批量生成CSV
java·python·pdf