新网站建设方案ppt,一个简单鲜花的html网页,wordpress 点赞,软件uiSpring框架处理循环依赖主要依赖于其容器的设计和几个关键的缓存机制#xff0c;这里所说的“三级缓存”是一个广为流传的概念#xff0c;用于简化描述Spring处理循环依赖的过程。实际上#xff0c;Spring处理循环依赖的核心策略可以概括为以下几个步骤#xff0c;主要针对…Spring框架处理循环依赖主要依赖于其容器的设计和几个关键的缓存机制这里所说的“三级缓存”是一个广为流传的概念用于简化描述Spring处理循环依赖的过程。实际上Spring处理循环依赖的核心策略可以概括为以下几个步骤主要针对 singleton scope 的bean 实例化First Level Cache: 当Spring容器创建一个bean时首先会在一级缓存单例对象缓存中查找该bean是否已经存在。如果不存在容器开始实例化该bean并将其ObjectFactory一个能够返回bean实例的工厂对象而不是直接的bean实例放入一个临时的缓存可以认为是第二级缓存的前身中这个操作发生在bean实例被完全初始化之前。 早期暴露Second Level Cache: 在bean实例化之后但属性注入完成之前Spring会将一个可使用的尽管尚未完成依赖注入bean实例或者更准确地说是前面提到的ObjectFactory提前暴露到一个专门的缓存即第二级缓存中这个缓存允许其他正在被创建且依赖于它的bean获取到这个bean的引用。这个步骤是解决循环依赖的关键因为它打破了依赖创建的顺序限制。 完成依赖注入Third Level Cache 或 Singleton Factories Cache: 当所有必要的bean实例都已存在于第二级缓存中Spring会完成这些bean的依赖注入过程。对于那些已经被部分构造并存在于第二级缓存中的bean它们会被从ObjectFactory转换成实际的bean实例并最终存储到一级缓存中此时bean被视为完全初始化。这个转换过程涉及从第二级缓存取出ObjectFactory并调用它来获得完整的bean实例然后这个实例会被放入第三级缓存即单例工厂缓存最后再移到一级缓存中。
注意这个过程中构造器注入的循环依赖是不能解决的因为构造器注入要求所有依赖项在对象创建时就必须存在这会导致直接抛出BeanCurrentlyInCreationException异常。而setter注入或者字段注入基于Autowired的循环依赖可以在上述机制下得到解决前提是这些bean都是单例的。
另外非单例prototypescope的bean由于每次请求都会创建新的实例因此Spring不会解决它们之间的循环依赖问题。