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>

✨ 运行结果

相关推荐
码农小河664 小时前
基于SSM+JSP的高校专业信息管理系统【附源码+数据库】
java·开发语言·数据库
张小姐的猫4 小时前
【MySQL】访问 & 数据流动原理
android·数据库·mysql·adb·1024程序员节
风若飞6 小时前
Spring Ai 入门遇到问题1
java·后端·spring
Nuanyt6 小时前
LeetCode Hot 100 链表专题(五)· 2 题(Java)
java·算法·leetcode·链表
朱涛的自习室6 小时前
212 个需求、22 万行代码:Agent 接管开源项目的 19 天
android·前端·人工智能
黑马程序员毕设7 小时前
基于 Java 的餐饮点餐系统设计与应用报告
java·开发语言
SL_staff7 小时前
从文档工具到知识中枢:基于JVS数字底座构建企业级统一内容管理平台的技术实践
java·开源·全栈
SL_staff7 小时前
从‘连得上’到‘管得好’:JVS-IOT双引擎驱动设备运维闭环
java·物联网·产品
w_zero_one9 小时前
递归算法(一)
java·开发语言·算法
SL_staff10 小时前
私有化低代码不是减配版开发:JVS双模式建模如何重建IT交付信任
java·低代码·spring cloud