Spring源码解读之@Autowired如何解决循环依赖

本文探讨了在Spring框架中,@Autowired注解如何处理循环依赖问题。首先介绍了@Autowired的作用,接着阐述了循环依赖的概念,并通过示例展示了A和B类之间的依赖关系。文章深入解析了Spring解决循环依赖的机制,包括BeanFactory的早绑定回调和ObjectFactory的使用,详细解释了在bean创建过程中如何避免和解决循环依赖,确保正确注入。
摘要由CSDN通过智能技术生成

@Autowired的what&how

在spring框架下,我们可以通过@Autowired注解对属性或者方法参数进行标注,当spring ioc容器初始化时,会帮我们从容器中拿到对应的实例进行注入

什么是循环依赖

假如现在有两个Bean如下所示

public class BeanA {
   
    @Autowired
    private BeanB beanB;
}

public class BeanB {
   
    @Autowired
    private BeanA beanA;
}

然后我们通过annotationConfigApplicationContext#register将两个bean的信息注入到容器中,最后通过refresh进行容器到初始化操作

public static void main(String[] args) {
   
        AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext();
        annotationConfigApplicationContext.register(Bean1.class);
        annotationConfigApplicationContext.register(Bean2.class);
        annotationConfigApplicationContext.refresh();
    }

可以看到A跟B互相依赖,试着想象:当容器先初始化beanA时,必然要对属性beanB进行赋值,这个时候容器中还没有beanB,那么势必会触发beanB的初始化流程,而beanB初始化的完成也需要对属性beanA赋值,但beanA还未初始化完成,这里就产生了所谓的循环依赖。

spring如何解决循环依赖

这里有一个很关键的属性:

public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry {
   
	/** Cache of singleton factories: bean name to ObjectFactory. */
	private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);
}

key是beanName,value是一个对象工厂,我们点进去看一下

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值