PHP程序员每月培养1项高密度习惯:庖丁解牛式技术精进法
2026/10/14 16:38:04
一个或多个对象之间存在直接或间接的依赖关系,这种依赖关系构成一个环形调用,有下面 3 种方式。
经典的循环依赖
A中注入了一个B;
@Component public class A { @Autowired private B b; public A(){ System.out.println("init A"); } }B中注入了A;
@Component public class B { @Autowired private A a; public B() { System.out.println("init B"); } }DefaultSingletonBeanRegistry
// 第一级缓存 private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256); //第二级缓存 private final Map<String, Object> earlySingletonObjects = new HashMap<>(16); //第三级缓存 private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);//解决循环依赖关键类: AbstractAutowireCapableBeanFactory Springboot是在613行,SpringMVC是在 588行 addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));当我们去调用getBean()方法的时候, Spring会先从一级缓存中去找到目标Bean,如果发现一级缓存中没有 便会去二级缓存中 去找,而如果一、二级缓存中都没有找到,意味着该目标Bean还没有实例化。于是,Spring容器会实例化目标Bean