Spring源码解析(五) 解决循环依赖问题
SunRan

前言

什么是依赖注入?

1
2
3
4
5
6
7
8
9
@Component
public class A {
private B b;
}

@Component
public class B {
private A a;
}

如上代码,A和B相互依赖对方

  • 注入A对象的时候发现需要B对象,那就先去注入B对象
  • 注入B对象的时候发现需要A对象,那就先去注入A对象
  • 注入A对象的时候发现需要B对象,那就先去注入B对象
  • 注入B对象的时候发现需要A对象,那就先去注入A对象

… 不断循环导致注入失败。

解决方案

一句话回答如何解决循环依赖:Spring解决循环依赖的核心思想在于提前曝光

创建Bean的时候将流程分为两步走,先实例化再初始化只实例化没有初始化的叫半成品(放置在二级缓存**earlySingletonObjects)反之则是完成品(放置在一级缓存singletonObjects**)。

A注入对象时遇到依赖其他属性先到完成品池子寻找对象,没有则去半成品池子,半成品也没有则创建一个半成品。A对象注入时先不考虑属性完成与否,先将属性逐个注入,保证自己是个完成品并放置到一级缓存,然后B对象依赖A属性时直接从一级缓存取出即可。

这个机制的一个前提:无论怎么填充属性,对象的内存地址是不会改变的。

  • 本文标题:Spring源码解析(五) 解决循环依赖问题
  • 本文作者:SunRan
  • 创建时间:2022-01-25 11:09:22
  • 本文链接:https://lksun.cn/2022/01/25/Spring源码解析-五-解决循环依赖问题/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
 评论