spring循环依赖

spring循环依赖有两种状况:spring

1.构造器循环依赖缓存

构造器循环依赖是没办法姐解决的,只能抛出BeanCurrentlyCreationException.prototype

由于spring在建立bean的时候,发现建立的bean依赖其余bean,这时候spring会将该bean放入一个缓冲池(正在建立的缓冲池),而后再去建立其依赖的bean(每次建立bean的时候都会去校验这个bean时是否在缓冲池中),直到最后一个依赖bean成功建立,没成功建立一个bean,就会从缓冲池中删除这个bean的状态作用域

例如:io

A 依赖 B,B依赖C ,C依赖A,那么在建立A的时候,发现A依赖B,那么spring会把A打上一个标记(正在建立)放进缓冲池,转而去建立B,发现B又依赖C,一样会把B打上一个标记,转而去建立C,在建立C的时候,发现C依赖A,则去建立A,这时候在建立A的时候发现A已经在缓冲池中了,表示这时候出现了循环依赖,就抛出异常依赖注入

2.setter循环依赖循环

对于setter循环依赖,spring只能解决单例做用域bean的setter循环依赖,能够经过setAllowCircularReferences(false)来禁用循环引用。map

例如 A setter依赖B ,B setter依赖C, Csetter依赖A引用

1.在构造A的时候,先使用A默认的构造器初始化A,并暴露一个关于A的ObjectFactory放到SinglonFactory的map中缓存起来,而后setter注入B,这时候发现B尚未初始化,会把A打上一个正在建立的标记,并缓存起来,转而去初始化B异常

2.初始化B的过程跟A同样,会暴露一个ObjectFactory到singLonFactory缓存起来,

3.接着初始化C,一样也会暴露一个ObjectFactory到singLonFactory缓存起来,这时候在setterA的时候,发如今singLonFactory中有关于A的ObjectFactory,那么就能够经过ObjectFactory提早暴露一个正在建立的A,这样就完成了C的注册,并删除正在建立缓存吃中C的状态

3.prototype做用域的bean没法完成依赖注入,由于spring在建立prototype做用域的bean的时候,是不会缓存其正在建立的状态,所以没办法提早暴露一个正在建立的bean

因此prototype做用域的bean出现循环依赖,则会抛BeanCurrentlyCreationException异常

相关文章
相关标签/搜索