Spring Bean 生命周期与循环依赖详解

Spring Bean 生命周期与循环依赖详解

  1. Java 对象与 Spring Bean 的区别:

    • Java 对象的创建步骤:编译源码 -> 类加载到 JVM -> 初始化对象。
    • Spring Bean 使用 BeanDefinition 描述对象信息,如 @Scope@Lazy 等。
  2. Spring Bean 生命周期:

    • 扫描 Bean 信息:从 XML、注解或 JavaConfig 中读取。
    • 封装 BeanDefinition :存储到 beanDefinitionMap 中。
    • 执行 BeanFactoryPostProcessor :如 PropertyPlaceholderConfigurer 注入占位符信息。
    • 实例化 Bean:通过反射选择构造器,实例化对象,但未注入属性。
    • 属性注入 :解决依赖,如 UserService 依赖 SendService
    • 初始化工作
      • 检查是否实现了 Aware 接口,如 ApplicationContextAware 获取 ApplicationContext
      • 执行 BeanPostProcessor,如 AOP 关键的 AnnotationAwareAspectJAutoProxyCreator
      • 执行 @PostConstructInitializingBeaninit-method 等初始化方法。
    • 销毁 Bean :执行 destroy-method
  3. 循环依赖解决方案:

    • 三级缓存

      • 一级缓存singletonObjects,存储完全初始化的单例 Bean。
      • 二级缓存earlySingletonObjects,存储未完全初始化的单例 Bean。
      • 三级缓存singletonFactories,存储 Bean 工厂处理代理对象。
    • 过程

      1. 实例化 A:A 放入三级缓存。
      2. 注入 A 的属性:需要 B,实例化 B。
      3. 实例化 B:B 依赖 A,从三级缓存获取 A 的代理,将A代理对象放入二级缓存。
      4. 初始化 B:从二级缓存移至一级缓存。
      5. 返回 A:继续注入 A 的属性,完成初始化,移至一级缓存。
  4. 关键源码位置

    • AbstractApplicationContext#refresh
    • AbstractApplicationContext#finishBeanFactoryInitialization
    • ConfigurableListableBeanFactory#preInstantiateSingletons
    • AbstractBeanFactory#getBean
    • AbstractBeanFactory#doGetBean
    • DefaultSingletonBeanRegistry#getSingleton
    • AbstractAutowireCapableBeanFactory#createBean
    • AbstractAutowireCapableBeanFactory#doCreateBean
    • AbstractAutowireCapableBeanFactory#createBeanInstance
    • DefaultSingletonBeanRegistry#addSingletonFactory
    • AbstractAutowireCapableBeanFactory#populateBean
    • AbstractAutowireCapableBeanFactory#initializeBean

总结:

  • Spring 使用 BeanDefinition 管理 Bean 的元数据。
  • Bean 实例化和属性注入分开进行。
  • 生命周期中提供了多种扩展点,如 BeanFactoryPostProcessor、Aware 接口、BeanPostProcessor 和初始化方法。
  • 三级缓存解决循环依赖问题,通过 ObjectFactory 处理代理对象。
相关推荐
无心水2 小时前
【OpenClaw:实战部署】5、全平台部署OpenClaw(Win/Mac/Linux/云服务器)——10分钟跑通第一个本地AI智能体
java·人工智能·ai·智能体·ai智能体·ai架构·openclaw
一只大袋鼠3 小时前
Redis 安装+基于短信验证码登录功能的完整实现
java·开发语言·数据库·redis·缓存·学习笔记
※DX3906※4 小时前
Java排序算法--全面详解面试中涉及的排序
java·开发语言·数据结构·面试·排序算法
cur1es5 小时前
【JVM类加载&双亲委派模型&垃圾回收机制】
java·jvm·gc·垃圾回收·类加载·双亲委派模型
Mr.朱鹏5 小时前
JVM-GC垃圾回收案例
java·jvm·spring boot·算法·spring·spring cloud·java-ee
焦糖玛奇朵婷5 小时前
实测扭蛋机小程序:开发简单,互动有趣
java·大数据·程序人生·小程序·软件需求
Nan_Shu_6145 小时前
学习: 尚硅谷Java项目之小谷充电宝(3)
java·后端·学习
wzqllwy5 小时前
8 大经典排序算法(Java 实现):原理 + Demo + 核心分析
java·算法·排序算法
智能工业品检测-奇妙智能5 小时前
AIFlowy如何实现与现有Spring Boot项目的无缝集成?
java·spring boot·后端
從南走到北5 小时前
JAVA无人共享无人健身房物联网结合系统源码支持小程序+公众号+APP+H5
java·物联网·小程序