具体的结构设计:
在上面的图片中:
UnboundBlackVerifyChain类中继承了UnboundChain类。但是UnboundChain类中注入了下面三个类。
@Scope(“prototype”)
UnboundLinkFlowCheck类
@Scope(“prototype”)
UnboundUserNameCheck类
@Scope(“prototype”)
UnboundIdCardCheck类
这三个类都是原型的且都注入了DeconstructionService类。
但是DeconstructionService类中又注入了UnboundBlackVerifyChain类。那么就形成了循环依赖了。
在Spring框架中,当两个bean相互依赖时,可能会出现循环依赖问题。Spring可以处理某些情况下的循环依赖,但其处理能力取决于bean的作用域(scope)。
单例作用域(Singleton Scope)
对于默认的单例作用域,Spring能够通过三级缓存机制处理循环依赖。Spring会在创建bean的过程中,将尚未完全初始化的bean实例暴露在一个早期引用的缓存中,这样其他bean在依赖时可以引用到这个早期的实例。
原型作用域(Prototype Scope)
对于原型作用域,情况就不同了。Spring不支持原型作用域下的循环依赖。原因是原型bean在每次请求时都会创建一个新的实例,Spring无法像处理单例bean那样在创建过程中缓存和注入未完全初始化的bean实例。
因此,当A模块和B模块都配置为原型作用域并且相互依赖时,Spring会在尝试创建bean时抛出一个BeanCurrentlyInCreationException,因为它无法解决这种循环依赖。