0源码基础学习Spring源码系列(二)——Spring如何解决循环依赖

💡 原文中文,约10700字,阅读约需26分钟。
📝

内容提要

Spring通过三级缓存解决循环依赖问题:先实例化源对象,然后在源对象初始化完成之后才会获取代理对象,从而解决循环依赖问题。二级缓存的作用是存储从factory中获取到的对象,原始对象A1初始化完成后,因为A2是对A1的封装以及增强,也就代表着A2也完成了初始化。从而在A1装配完之后,以后其他bean依赖的应该是A2,并且加入到一级缓存中的也应该是A2。

🎯

关键要点

  • Spring通过三级缓存解决循环依赖问题,先实例化源对象,再获取代理对象。
  • 循环依赖常见于A依赖B,B依赖C,C依赖A,Spring只能解决通过属性或setter注入的单例bean。
  • 三级缓存包括:一级缓存存放完全初始化好的bean,二级缓存存放原始bean,三级缓存存放单例对象工厂。
  • 创建bean的流程包括实例化bean、装配bean属性和初始化bean。
  • 在循环依赖中,Spring通过三级缓存确保依赖的bean可以正常工作。
  • 代理对象的创建需要特殊处理,Spring在实例化源对象后才获取代理对象。
  • 二级缓存的作用是存储从factory中获取到的对象,避免每次调用产生新的代理对象。
  • 代理对象的初始化与原始对象的初始化是相互关联的,代理对象持有目标类的引用。
  • Spring选择滞后生成代理对象,以保持普通bean的创建流程不被破坏。
🏷️

标签

➡️

继续阅读