Spring循环依赖

循环依赖:
在Spring中, 两个类互相引用, 由于Spring的实例化机制, 在实例化当前类时,也会对当前类中带有Spring注入注解的属性或方法也进行实例化,这样就出现了循环依赖。
Spring通过三级缓存来解决循环依赖问题,首先实例化A类时, Spring会先调用getSingleton方法来从缓存中获取实例,如果获取到了则直接返回,如果缓存中不存在则在getSingleton中会先调用beforeSingletonCreation方法将实例的beanName放入SingletonCurrentlyInCreation容器中(表示该Bean正在创建实例中), 接着调用objectFactory.getObject()方法来获取实例(getObject的实现由外层的函数方法执行的结果,实际上就是调用createBean, 拿到实例化后的返回值), 获取到了实例,表示已经实例化完成, 调用addSingleton方法将成功实例化完成的对象放入一级缓存中,并将二级,三级缓存删除. 最后在finally中调用afterSingletonCreation方法, 将beanName从SingletonCurrentlyInCreation中移除, 并返回已经实例化完成的对象
在createBean时, 如果你的对象时单例的, 并且已经在SingletonCurrentlyInCreation容器中存在, 那么就会调用addSingletonFactory方法,在这里进行添加三级缓存,由于三级缓存存的是对象工厂singletonFactories, 所以还需要调用其中的getObject方法来进行获取实例,这个getObject与上面大致一致, 只不过createBean方法改成了getEarlyReference方法来获取对象实例。
一级缓存(单例池):singletonObjects 用于存放已经实例化完成的bean
二级缓存:earlySingletonObjects 用于存放正在实例化中的bean, 循环依赖中, 第二次实例化A类时, A类对应的Bean已经在三级缓存中存在,并且在SingletonCurrentlyInCreation中存在,则会将三级缓存升级到二级缓存
三级缓存:singletonFactories,用于存放BeanName 和ObjectFactory的关系映射,第一次实例化时,缓存中不存在该类的实例,则会首先添加进三级缓存

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页