spring源码中的相互依赖问题以及解决办法

spring在单例的情况下是默认支持循环引用的,在不做任何配置的情况下,两个bean相互依赖是能初始化成功的;

spring源码中在创建bean的时候先创建这个bean的对象,创建对象完成之后通过判断容器对象的allowCircularReferences属性决定是否允许缓存这个临时对象,如果能被缓存成功则通过缓存提前暴露这个临时对象来完成循环依赖;

而这个属性默认为true,所以说spring默认支持循环依赖的,但是这个属性spring提供了api让码农进行修改,所以spring也提供了关闭循环引用的功能(setAllowCircularReferences(false));

再就是spring完成这个临时对象的生命周期的过程中当执行到注入属性或者自动装配的周期时候会通过getSingleton方法去得到需要注入的B对象;

而B对象这个时候肯定不存在故而会创建B对象创建B对象成功后继续B对象的生命周期,当执行到B对象的自动注入周期时候会要求注入A对象;调用getSingleton;

从map缓存中得到A的临时对象,而且获取的时候也会判断是否允许循环引用,但是判断的这个值是通过参数传进来的,也就是spring内部调用的,spring源码当中写死了为true,故而如果需要扩展spring、或者对spring二次开发的的时候程序员可以自定义这个值来实现自己的功能;不管放到缓存还是从缓存中取出这个临时都需要判断;而这两次判断spring源码当中都是默认为true;

至此再次说明spring默认是支持循环引用的;

 

你可能感兴趣的:(框架)