spring循环依赖问题

a依赖b,b依赖a
先尝试获取bean,到bean工厂,bean工厂到bean的仓库取,有就返回,没有就创建
解决循环依赖需要用到三级缓存;
bean处理器调用AOP处理器,创建代理对象,有一个提前处理和一个后置处理的方法;
先getBean,实例化,填充属性,初始化,代理:先调用提前处理,提前暴露,先把factory(A)放入三级缓存(调用提前处理方法),先把代理A放入单例池里;
bean由beanDefintion来的,beanDefintion是一个建模的类
首先spring容器启动,它会做一个扫描,会把它变成beanDefintion存到beanDefintion Map当中,然后对beanDefintion做遍历,进行验证(是否单例,是否原型,是否懒加载等等)
验证完之后去单例池看看是否存在,是否提前暴露,没有就开始创建,存在就直接返回
首先 实例化java对象,然后做初始化工作,看它是否支持循环依赖,如果支持会提前暴露一个当前对象的ObjectFactoy(A)对象;存入二级缓存里;
之后继续做属性填充,这时候就发现引用到B,开始创建B,实例化之后暴露B,然后属性填充填充A,这个时候A并没有走完不在单例池里面,这个时候去走A的创建流程,这个给时候发现A已经提前暴露,
就拿到了A对象的ObjectFactory;然后B就走完了,接着返回到A。

为什么不直接缓存A对象,而是缓存ObjectFactoryA呢?
直接返回的是A对象,那么我们就很难对A进行扩展和改变,如果暴露的是ObjectFactory,我们可以通过beanPostProcessor能够对bean进行一些进行一些处理

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值