返回
循环依赖的正典分析,读懂之后彻底理解SpringBean的创建过程
后端
2023-12-17 06:17:50
循环依赖产生的原理
循环依赖是指两个或多个Bean相互依赖,即A依赖B,B又依赖A。在Spring中,循环依赖通常是由于Bean之间存在循环引用引起的。例如,如果Bean A有一个属性B,而Bean B又有一个属性A,那么这两个Bean就会产生循环依赖。
Spring解决循环依赖的方案
Spring提供了三种方案来解决循环依赖问题:
- 三级缓存 :Spring在创建Bean的过程中会使用三级缓存来存储已经创建的Bean实例。当Spring遇到循环依赖时,它会首先检查三级缓存中是否已经存在循环依赖的Bean实例。如果存在,则直接从三级缓存中获取Bean实例,从而避免循环依赖的发生。
- 构造函数注入 :构造函数注入是指在Bean的构造函数中直接注入其他Bean。当Spring遇到循环依赖时,它会使用构造函数注入来解决这个问题。Spring会首先创建循环依赖的Bean实例,然后将这些Bean实例注入到其他Bean的构造函数中。
- 多实例Bean :多实例Bean是指每次使用时都会创建一个新的实例。Spring会为每个多实例Bean创建一个单独的实例,从而避免循环依赖的发生。
三级缓存的产生原理
三级缓存是Spring用来存储已经创建的Bean实例的缓存。三级缓存分为一级缓存、二级缓存和三级缓存。
- 一级缓存:一级缓存存储的是正在创建的Bean实例。
- 二级缓存:二级缓存存储的是已经创建完成的Bean实例。
- 三级缓存:三级缓存存储的是已经完成依赖注入的Bean实例。
当Spring创建Bean时,它会首先检查一级缓存中是否已经存在该Bean实例。如果存在,则直接从一级缓存中获取Bean实例。如果一级缓存中不存在,则Spring会创建一个新的Bean实例并将其存储在一级缓存中。
当Bean创建完成后,Spring会将其从一级缓存中移动到二级缓存中。当Bean完成依赖注入后,Spring会将其从二级缓存中移动到三级缓存中。
如何解决构造函数的循环依赖和多实例的循环依赖
构造函数的循环依赖是指在Bean的构造函数中直接注入其他Bean时发生的循环依赖。多实例的循环依赖是指每次使用时都会创建一个新的实例的Bean之间发生的循环依赖。
Spring提供了两种方案来解决构造函数的循环依赖和多实例的循环依赖:
- 使用延迟初始化 :延迟初始化是指在Bean创建时不立即创建其属性,而是等到使用时才创建。Spring可以通过延迟初始化来解决构造函数的循环依赖和多实例的循环依赖。
- 使用循环引用检测 :循环引用检测是指在Bean创建时检查是否存在循环依赖。Spring可以通过循环引用检测来解决构造函数的循环依赖和多实例的循环依赖。
总结
Spring提供了多种方案来解决循环依赖问题。在实际开发中,我们可以根据具体情况选择合适的方案来解决循环依赖问题。