【Spring】循环依赖

发布时间 2023-05-08 20:04:06作者: 飞翔在天

参考:

阿里开发者-Spring循环依赖那些事(有完整流程图)   https://mp.weixin.qq.com/s/cqkZEvmmh7jnNt2K5r_lXg   

 

问题:

1、什么是循环依赖?
2、为什么会产生循环依赖?
3、循环依赖有哪些场景?
4、Spring如何解决循环依赖的?
5、Spring为什么使用三级缓存?
6、Spring支持AOP循环依赖,为何还存在循环依赖异常?
7、Spring不支持的循环依赖场景及如何解决?

 

循环依赖:A->B->C->A

解决关键词:三级缓存

核心代码:org.springframework.beans.factory.support.DefaultSingletonBeanRegistry

  • private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);:  单例对象缓存池,beanName->Bean,其中存储的就是实例化,属性赋值成功之后的单例对象
  • private final Map<String, Object> earlySingletonObjects = new HashMap<>(16);:                 早期的单例对象,beanName->Bean,其中存储的是实例化之后,属性未赋值的单例对象。
  • private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);:     单例工厂的缓存,beanName->ObjectFactory

核心概念:

BeanDefinition:spring核心bean的配置信息
Spring Bean:spring管理的已经初始化好以后的可使用的实例
首先,通过spring通过扫描各种注解 @Compoent、@Service、@Configuration等等把需要交给spring管理的bean初始化成 BeanDefinition 的列表
然后,根据 BeanDefinition 创建spring bean的实例
Java Bean:Java简单通过构造函数创建的对象
Spring通过推断构造方法后,通过反射调用构造函数创建的对象