Spring的三级缓存
循环依赖问题如何解决?
Spring 中设计了三级缓存来解决循环依赖问题,当我们去调用 getBean()方法 的时候,Spring 会先从一级缓存中去找到目标 Bean,如果发现一级缓存中没有,则会去二级缓存中去找,而如果一、二级缓存中都没有找到,意味着该目标 Bean 还没有实例化。于是,Spring 容器会实例化目标 Bean(PS:刚初始化的 Bean 称为早期 Bean) 。然后将目标 Bean 放入到二级缓存中,同时加上标记是否存在循环依赖。如果不存在循环依赖便会将目标 Bean 存入到二级缓存,否则便会标记该 Bean 存在循环依赖,然后将等待下一次轮询赋值,也就是解析 @Autowired 注解。等@Autowired 注解赋值完成后(PS:完成赋值的 Bean 称 为成熟 Bean) ,会将目标 Bean 存入到一级缓存。
Spring 一级缓存中存放所有的成熟 Bean, 二级缓存中存放所有的早期 Bean,先取一级缓存,再取二级缓存。
三级缓存的作用是什么?
三级缓存是用来存储代理 Bean,当调用 getBean()方法时,发现目标 Bean 需要 通过代理工厂来创建,此时会将创建好的实例保存到三级缓存,最终也会将赋值好的 Bean 同步到一级缓存中。
Spring 中哪些情况下,不能解决循环依赖问题?
学习资料:
https://lan861698789.blog.csdn.net/article/details/109554429
https://www.bilibili.com/video/BV15y4y1z7E4/?spm_id_from=333.788.top_right_bar_window_history.content.click&vd_source=46d50b5d646b50dcb2a208d3946b1598
https://www.bilibili.com/video/BV1MP411Q7Pa/?spm_id_from=333.788.recommend_more_video.1&vd_source=46d50b5d646b50dcb2a208d3946b1598
https://juejin.cn/post/7190744581351473207#comment
https://www.bilibili.com/video/BV1dP411J7tQ/?spm_id_from=333.337.search-card.all.click&vd_source=46d50b5d646b50dcb2a208d3946b1598
作者:静默虚空
欢迎任何形式的转载,但请务必注明出处。
限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
2022-06-10 Aspect中execution和annotation使用(AOP的实现)