Spring初始化之循环依赖
InjectionMetadata.inject
resolveFieldValue解析去解析 对象的属性时
会自动去解析该属性是否是Bean依赖对象
DefaultListableBeanFactory.doResolveDependency会去调用DependencyDescriptor.resolveCandidate方法
而DependencyDescriptor.resolveCandidate方法就是回去调用BeanFactory.getBean方法
最终还是会调用AbstractBeanFactory.doGetBean方法,再回到AbstractAutowireCapableBeaFactory.doCreateBean,进行循环依赖注入。
循环依赖出现的问题
Spring通过三级缓存思想,对循环依赖出现的问题进行规避,到出现循环依赖问题时,提前中断初始化。
它的思想是,当某个Bean A在初始化时,放入到正创建Bean的缓存中,当Bean B在在初始化时,如果需要注入Bean A,而Bean B初始化时也需要注入Bean A,而Bean A必须依赖于Bean B初始化完成,导致Bean A无法初始化,BeanA 无法初始化就会导致BeanB也无法初始化,就会出现循环依赖问题,使项目无法启动
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~