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

posted @ 2023-06-10 21:41  Chenyi_li  阅读(1145)  评论(0)    收藏  举报