2026/5/21 9:27:24
网站建设
项目流程
网站开发翻译,潍坊市建设局门户网站,建设网站需要什么东西,正规网站建设找哪家好Spring 是如何解决循环依赖问题的#xff1f;1、什么是循环依赖 #xff1f;一个或多个对象之间存在直接或间接的依赖关系#xff0c;这种依赖关系构成一个环形调用#xff0c;有下面 3 种方式。经典的循环依赖A中注入了一个B#xff1b;Component
public class A {Autowi…Spring 是如何解决循环依赖问题的1、什么是循环依赖 一个或多个对象之间存在直接或间接的依赖关系这种依赖关系构成一个环形调用有下面 3 种方式。经典的循环依赖A中注入了一个BComponent public class A { Autowired private B b; public A(){ System.out.println(init A); } }B中注入了AComponent public class B { Autowired private A a; public B() { System.out.println(init B); } }2、Spring是利用三级缓存机制来解决循环依赖问题的DefaultSingletonBeanRegistry// 第一级缓存 private final MapString, Object singletonObjects new ConcurrentHashMap(256); //第二级缓存 private final MapString, Object earlySingletonObjects new HashMap(16); //第三级缓存 private final MapString, ObjectFactory? singletonFactories new HashMap(16);一级缓存单例池用来存放已经初始化完成的单例 Bean走完整个生命周期二级缓存存放原始的Bean对象也就是说Bean里面的属性还没有进行赋存放对象工厂生成的对象这个对象可能是原对象也可能是个代理对象三级缓存存放Bean对象工厂结构是 MapString, ObjectFactory?Map 的 Value 是一个对象的工厂用来生成原始Bean对象或者是原始对象的代理并放入到二级缓存中打破循环依赖关键对象如果 A 有 AOP就返回一个代理对象如果 A 没有 AOP就返回原对象。//解决循环依赖关键类 AbstractAutowireCapableBeanFactory Springboot是在613行SpringMVC是在 588行 addSingletonFactory(beanName, () - getEarlyBeanReference(beanName, mbd, bean));当我们去调用getBean()方法的时候 Spring会先从一级缓存中去找到目标Bean如果发现一级缓存中没有 便会去二级缓存中 去找而如果一、二级缓存中都没有找到意味着该目标Bean还没有实例化。于是Spring容器会实例化目标Bean