Spring Bean循环依赖实例化逻辑

ObjectFactory 中 会存储

  1. beanName
  2. Bean的定义
  3. Bean实例 : 只当进行了初始化 和 属性注入的实例,缺少循环依赖的bean 或 为初始化的bean
  4. Bean的工厂 :DefaultListableBeanFactory

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean
中先会创建bean的实例,然后填充属性,之后会判断是否包含循环依赖,是的话会调用getSingleton 去获取早期单例引用

比如 A 类中 依赖了B ,B中又依赖了A
但Spring 扫描到A 时 -> 进行初始化 -> 然后进行属性注入 -> 发现缺少B ,尝试从缓存中取,没取到 -> 然后进行B 的初始化 -> 然后进行B的属性注入,发现缺少A ,然后尝试从缓存中取,取到了 -> 将A注入到B中,从工厂中移除本实例,然后返回实例 -> A获取到B实例,继续A的属性注入,然后下一个Bean。

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean

protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {
		if (bw == null) {
			if (mbd.hasPropertyValues()) {
				throw new BeanCreationException(
						mbd.getResourceDescription(), beanName, "Cannot apply property values to null instance");
			}
			else {
				// Skip property population phase for null instance.
				return;
			}
		}

		// Give any InstantiationAwareBeanPostProcessors the opportunity to modify the
		// state of the bean before properties are set. This can be used, for example,
		// to support styles of field injection.
		//会执行所有的InstantiationAwareBeanPostProcessors 其中一个是 AutowiredAnnotationBeanPostProcessor, 会将属性进行注入,即执行@Autowire 和 @Value 的逻辑
		if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
			for (BeanPostProcessor bp : getBeanPostProcessors()) {
				if (bp instanceof InstantiationAwareBeanPostProcessor) {
					InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
					if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
						return;
					}
				}
			}
		}

会执行所有的InstantiationAwareBeanPostProcessors 其中一个是 AutowiredAnnotationBeanPostProcessor, 会将属性进行注入,即执行@Autowire 和 @Value 的逻辑

扩展
  1. 为什么Spring 使用三级缓存,而不是二级缓存?

第三级缓存是Spring提供SmartInstantiationAwareBeanPostProcessor 给用户做扩展,如果用户没有实现该接口则这一层也就啥也没做,直接返回bean
Spring 本身会在populateBean 执行自己的InstantiationAwareBeanPostProcessor

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值