Spring循环依赖包含构造器循环依赖和setter方法循环依赖。
通过构造器注入构成的循环依赖是无法解决的,只能抛出beanCurentlyInCreationException异常。
Spring容易将每一个正在创建的bean标识符存放在一个当前bean的创建池中,bean标识符在创建过程中将一直保持这个这个池中,因此 如果在创建bean的过程中发现自己已经在当前创建bean池中时 ,就会抛出beanCurrentlyInCreationException异常来表示循环依赖。对于创建完成的bean将从bean创建池中删除。
对于setter方法注入的循环依赖,是通过Spring容器提前暴露刚完成构造器注入但未完成其它步骤(如setter注入)的bean来完成的。而且只能解决单例作用域的bean循环依赖。通过提前暴露一个单例工厂方法,从而使其它bean能够引用到该bean。而对于prototype范围的依赖处理,因为不缓存该作用域的bean,所以无法提前暴露一个创建中的bean;
关于三级缓存:首先尝试从singletonObjects里获取实例,如果获取不到再从earlysingletonObjects获取,如果还获取不到,在尝试从singletonfactories里获取beanname对应的objectfactory,然后调用这个objectfactory的getobject来获取bean,并放到earlysingletonobjects里,并且从singtonfactories里remove掉这个objectfactory。



