关注
Spring如何解决循环依赖
spring中循环依赖有三种情况:
1、构造器注入形成的循环依赖。也就是beanB需要在beanA的构造函数中完成初始化,beanA也需要在beanB的构造函数中完成舒适化,这种情况的结果就是两个bean都不能完成初始化,循环依赖难以解决。
2、setter注入构成的循环依赖。beanA需要在beanB的setter方法中完成初始化,beanB也需要在beanA的setter方法中完成初始化,spring设计的机制主要就是解决这种循环依赖,也是今天下文讨论的重点。
3、prototype作用域bean的循环依赖。这种循环依赖同样无法解决,因为spring不会缓存‘prototype’作用域的bean,而spring中循环依赖的解决正是通过缓存来实现的。
下面主要说明第二种情况中循环依赖的解决方案
步骤一:beanA进行初始化,并且将自己进行初始化的状态记录下来,并提前向外暴露一个单例工程方法,从而使其他bean能引用到该bean(可能读完这一句,您仍然心存疑惑,没关系,继续往下读)
步骤二:beanA中有beanB的依赖,于是开始初始化beanB。
步骤三:初始化beanB的过程中又发现beanB依赖了beanA,于是又进行beanA的初始化,这时发现beanA已经在进行初始化了,程序发现了存在的循环依赖,然后通过步骤一中暴露的单例工程方法拿到beanA的引用(注意,此时的beanA只是完成了构造函数的注入但为完成其他步骤),从而beanB拿到beanA的引用,完成注入,完成了初始化,如此beanB的引用也就可以被beanA拿到,从而beanA也就完成了初始化。
spring进行bean的加载的时候,首先进行bean的初始化(调用构造函数),然后进行属性填充。在这两步中间,spring对bean进行了一次状态的记录,也就是说spring会把指向只完成了构造函数初始化的bean的引用通过一个变量记录下来,明白这一点对之后的源码理解至关重要。
https://www.cnblogs.com/myseries/p/11801097.html
查看原帖
点赞 评论
相关推荐
牛客热帖
更多
正在热议
更多
# 读研or工作,哪个性价比更高? #
23963次浏览 323人参与
# 科大讯飞求职进展汇总 #
258814次浏览 2594人参与
# 如果重来一次你还会读研吗 #
154334次浏览 1691人参与
# 秋招感动瞬间 #
10676次浏览 101人参与
# 你最满意的offer薪资是哪家公司? #
11787次浏览 109人参与
# 阿里巴巴创始人马云回国 #
14010次浏览 87人参与
# 文科生还参加今年的春招吗 #
3263次浏览 29人参与
# 长光卫星求职进展汇总 #
27556次浏览 183人参与
# 选择和努力,哪个更重要? #
41844次浏览 471人参与
# 职场新人生存指南 #
194962次浏览 5369人参与
# 打工人的工作餐日常 #
24684次浏览 221人参与
# 招聘要求与实际实习内容不符怎么办 #
40575次浏览 465人参与
# 机械制造岗投递时间线 #
19303次浏览 324人参与
# 机械人选offer,最看重什么? #
68545次浏览 433人参与
# 机械人怎么评价今年的华为 #
180278次浏览 1484人参与
# 影石Insta360求职进展汇总 #
107562次浏览 967人参与
# 如果再来一次,你还会学硬件吗 #
102684次浏览 1231人参与
# 正在实习的你,有转正机会吗? #
336108次浏览 2690人参与
# 如果公司降薪,你会跳槽吗? #
44439次浏览 349人参与
# 滴!实习打卡 #
554086次浏览 6003人参与