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>

✨ 运行结果

在这里插入图片描述

相关推荐

  1. 写线程之协程

    2024-05-14 08:14:08       28 阅读
  2. 写线程之memory_order应用

    2024-05-14 08:14:08       32 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-14 08:14:08       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-14 08:14:08       101 阅读
  3. 在Django里面运行非项目文件

    2024-05-14 08:14:08       82 阅读
  4. Python语言-面向对象

    2024-05-14 08:14:08       91 阅读

热门阅读

  1. Vue.js:轻量级而强大的前端框架

    2024-05-14 08:14:08       35 阅读
  2. 02-登录页面、动态路由、权限等模块开发

    2024-05-14 08:14:08       28 阅读
  3. 23. 合并 K 个升序链表 - 力扣(LeetCode)

    2024-05-14 08:14:08       41 阅读
  4. 【设计模式】桥接模式-学习记录

    2024-05-14 08:14:08       28 阅读
  5. 量子计算入门:原理与编程

    2024-05-14 08:14:08       33 阅读
  6. MySQL和MongoDB区别

    2024-05-14 08:14:08       36 阅读
  7. k8s 配置管理

    2024-05-14 08:14:08       52 阅读
  8. Redis 5.0 Stream数据结构深入分析

    2024-05-14 08:14:08       32 阅读
  9. 力扣:93. 复原 IP 地址

    2024-05-14 08:14:08       35 阅读
  10. 数据库和Redis数据不一致的问题

    2024-05-14 08:14:08       33 阅读
  11. Rust 语言不支持 goto 语句

    2024-05-14 08:14:08       35 阅读
  12. ubuntu 24.04 devilspie 报错解决

    2024-05-14 08:14:08       39 阅读
  13. CircleCI的原理及应用详解(二)

    2024-05-14 08:14:08       29 阅读
  14. 10、Go Gin 连接Redis以及Cookie&Session

    2024-05-14 08:14:08       33 阅读