目录

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 处理代理对象。
本文是转载文章,点击查看原文
如有侵权,请联系 xyy@jishuzhan.net 删除
相关推荐
Answer_ism1 小时前
【SpringMVC】SpringMVC拦截器,统一异常处理,文件上传与下载
java·开发语言·后端·spring·tomcat
丁总学Java2 小时前
深入解析 Java Stream API:筛选根节点的优雅实现!!!
java·stream·collectors·lambda 表达式
神仙别闹2 小时前
基于Python的垃圾短信分类
java·python·分类
我只有一岁半3 小时前
Spring 三级缓存能不能解决循环依赖?
spring·缓存
qq_13948428823 小时前
springboot444-基于Vue的网络小说交流平台(源码+数据库+纯前后端分离+部署讲解等)
java·vue.js·spring boot·mysql·spring·maven·intellij-idea
好好学习 6663 小时前
gitlab-ci.yml文件详解
java·ci/cd·gitlab
蝉叫醒了夏天3 小时前
【深度揭秘Maven】
java·maven
脑子慢且灵3 小时前
JavaIO流的使用和修饰器模式(直击心灵版)
java·开发语言·windows·eclipse·intellij-idea·nio
遥不可及~~斌3 小时前
深入理解 Spring Boot 应用的生命周期:从启动到关闭的全流程解析
java
阿绵4 小时前
【问题解决】Postman 测试报错 406
java·测试工具·spring·postman