Spring-Bean的实例化过程及循环依赖解决

时序图

在这里插入图片描述

Bean的实例化过程

在这里插入图片描述

循环依赖解决

通过三级缓存解决。循环依赖只会出现在单例模式下,在prototype或其他模式下,循环依赖会直接报错。
循环依赖只会出现在单例实例无参构造函数实例化情况下
有参构造函数的加@Autowired 的方式循环依赖是直接报错的,多例的循环依赖也是直接报错的
在这里插入图片描述

步骤

  1. A类无参构造函数实例化后,设置三级缓存
  2. A类populateBean进行依赖注入,触发B类的getBean
  3. B类无参构造函数实例化后,设置三级缓存
  4. B类populateBean进行依赖注入,触发A类的getBean
  5. A类之前正在实例化,singletonsCurrentlyInCreation集合中已经有 A类,三级缓存中也有了,所以这时从三级缓存中拿到了提取暴露的A实例,该实例还没有进行B类属性的依赖注入,B类属性为空
  6. B类拿到A的提前暴露实例注入到A类属性中
  7. B类实例化已经完成,B的实例化由A类实例化中B属性的依赖注入触发的getBean操作进行的,现在B已经实例化了,所以A中B属性也就可以完成依赖注入了,这时A类的B属性已经有值了
  8. B类A属性指向的就是A类实例堆空间,所以B类A属性也有值了。

singletonObjects

一级缓存, 创建完成的Bean保存的位置

earlySingletonObjects

二级缓存,当前正在创建的Bean,已实例化正在填充属性的Bean。

singletonFactories

三级缓存,拿到的是ObjectFactory对象。

BeanPostProcessor接口

BeanPostProcessor接口类型实例是针对具体特定功能的埋点,在这个点会根据接口类型过滤掉不关注这个点的其他类,只有真正关注的类才会在这个点进行相应的功能实现,

获取有@Autowired注解的构造函数埋点

过滤的接口类型是SmartInstantiationAwareBeanPostProcessor
调用方法是determineCandidateConstructors
在这里插入图片描述

收集@Resource@Autowired@Value@PostConstruct@PreDestroy注解的方法和属性埋点

过滤的接口类型MergedBeanDefinitionPostProcessor
调用的方法PostProcessMergedBeanDefinition
在这里插入图片描述

循环依赖Bean的提取暴露埋点

SmartInstantiationAwareBeanPostProcessor
getEarlyBeanReference
在这里插入图片描述

阻止依赖注入埋点

InstantiationAwareBeanPostProcessor
postProcessAfterInstantiation
在这里插入图片描述

IOC/DI依赖注入埋点

InstantiationAwareBeanPostProcessor
postProcessProperties
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值