spring的三级缓存解决循环依赖
作者:互联网
1.什么是循环依赖
指的是循环引用,两个或多个bean相互之间的持有对方的引用。spring会自动给对方注入赋值,会导致死循环。
2.哪些情况会出现循环依赖?
循环依赖有三种形态
ab相互依赖
abc三者依赖
a自我依赖
3.如何解决?spring设计三级缓存解决依赖问题
当我们去调用getBean()方法的时候,一级缓存会去找到对应目标bean
如果一级缓存中没有就回去二级缓存中去找,如果一二级都没有就意味着这个bean没有实例化,spring容器就会去实例化目标bean,实例化后,首先会将目标放入二级缓存种同时加上一个标记标记为是否循环依赖
如果不存在依赖就会将目标bean放入二级缓存中,否则,就会将这个目标标记为缓存依赖,等待下一次轮询进行在赋值,也就是说解析完@Autowired注解后,并且完成再赋值,我们才会将目标bean存到一级缓存中去
一级缓存中存放成熟的bean
二级缓存存放所有早期的bean,
先取一级缓存,再取二级缓存
4.为何需要三级缓存
三级缓存是用来存取代理的bean,当我们调用getBean方法的时候,发现目标bean需要代理工厂来创建,我们会把创建好的实例保存到三级缓存中,最后去将赋值好的bean再同步到一级缓存中
spring中哪些情况,不能解决依赖问题
1,多例bean通过setter注入的情况,不能解决循环依赖问题
2,构造器注入的bean情况,不能解决循环依赖问题
3,单例的代理bean通过setter注入的情况,不能解决循环依赖问题
4,设置了@DependsOn的bean,不能解决循环依赖问题
标签:缓存,依赖,spring,二级缓存,bean,循环,三级 来源: https://www.cnblogs.com/2246781190zyc/p/16152022.html