首页 > 其他分享 >为什么 Spring 循环依赖需要三级缓存,二级不够吗?

为什么 Spring 循环依赖需要三级缓存,二级不够吗?

时间:2024-12-15 20:53:22浏览次数:8  
标签:缓存 对象 Spring 二级缓存 代理 Bean 三级

Spring循环依赖解决机制中引入了三级缓存,这是因为仅使用二级缓存无法灵活处理代理Bean的早期暴露需求。以下是为什么需要三级缓存的详细分析:

1. 二级缓存的局限性
二级缓存通常用于存储早期暴露的未完全初始化的Bean实例。但在AOP代理场景下,Bean可能需要在完全初始化之前暴露其代理对象,而代理对象需要通过特定的工厂方法生成。这种动态代理的场景导致了二级缓存无法直接满足需求,因为它无法预知或动态生成代理对象。

假设使用二级缓存:

  • 如果提前将原始Bean放入二级缓存,后续需要使用代理对象时,就会因为二级缓存中存的是原始对象而导致错误。
  • 如果直接放代理对象,则需要在初始化之前生成代理对象,这与Spring的生命周期管理冲突。

2. 三级缓存的灵活性
三级缓存解决了上述问题,它通过存储一个可以动态生成Bean实例的工厂(ObjectFactory),为Spring提供了更大的灵活性:

  • 如果需要原始对象,可以通过工厂获取原始Bean。
  • 如果需要代理对象,可以通过工厂动态创建并返回代理对象。

三级缓存的流程:

  1. 创建Bean实例后,将其对应的工厂放入三级缓存(singletonFactories)。
  2. 在注入依赖时,如果需要该Bean的引用,先从一级缓存查找,若找不到,再从二级缓存查找,仍找不到时,从三级缓存通过工厂获取Bean。
  3. 如果三级缓存的工厂生成了代理对象,则可以将代理对象存入二级缓存供后续使用。
  4. 最终,当Bean完成初始化后,将完整的Bean放入一级缓存,并移除二级和三级缓存。

3. 为什么不能只用二级缓存?
在没有AOP或代理对象需求的情况下,二级缓存可以满足简单的循环依赖问题。然而,在复杂场景(如AOP)下:

  • 直接暴露实例可能导致后续操作无法使用代理对象。
  • 直接暴露代理对象可能导致代理过早生成,与Spring生命周期不符。
    因此,需要三级缓存来支持动态灵活的代理对象生成和原始对象的按需暴露。

4. 三级缓存的实际优势
三级缓存的引入提供了以下优势:

  1. 支持AOP代理的动态生成,解决代理Bean和循环依赖之间的矛盾。
  2. 避免提前暴露不完整的Bean,确保Bean生命周期管理的规范性。
  3. 提供了一个灵活的机制,可以在不同场景下按需生成不同形式的Bean(原始Bean或代理Bean)。

总结:
二级缓存虽然能够解决部分循环依赖问题,但在涉及动态代理和AOP时,它无法满足所有需求。三级缓存通过存储ObjectFactory,提供了动态生成和按需暴露的能力,从而使Spring能够更全面地解决循环依赖问题。

标签:缓存,对象,Spring,二级缓存,代理,Bean,三级
From: https://www.cnblogs.com/eiffelzero/p/18608702

相关文章

  • Spring 如何解决循环依赖?
    Spring通过三级缓存机制来解决单例Bean的Setter或字段注入类型的循环依赖问题。以下是Spring解决循环依赖的核心流程:1.三级缓存介绍Spring容器为了解决循环依赖,维护了以下三个缓存:一级缓存(singletonObjects):已完全初始化的单例Bean。二级缓存(earlySingletonObjects):早期暴露的......
  • 基于SpringBoot+vue的商城停车场管理系统(2024-2025年最新,原创项目)
    文章目录系统演示录像系统实际运行效果图技术框架SpringBoot-后端开发框架Vue-前端开发框架前后端分离的开发流程可行性分析系统测试系统测试的目的系统功能测试数据库表设计(供参考)1.用户表(t_user)2.角色表(t_role)3.权限表(t_permission)4.用户-角色关联表(t_user_r......
  • 基于SpringBoot + Vue的超市外卖系统的设计与实现(精选计算机毕业设计-源码+文档+部署)
    文章目录系统演示录像系统实际运行效果图技术框架SpringBoot-后端开发框架Vue-前端开发框架前后端分离的开发流程可行性分析系统测试系统测试的目的系统功能测试数据库表设计(供参考)1.用户表(t_user)2.角色表(t_role)3.权限表(t_permission)4.用户-角色关联表(t_user_r......
  • java&springboot&msyql进出校园门禁管理系统79219-计算机毕业设计 原创(附源码)
    摘 要信息化的进出校园门禁管理可以节省人力和物力,并且具有较高的精确性。随着计算机技术和网络技术的迅猛发展,进出校园门禁管理系统不断向着集成化、智能化、网络化与分布式的方向发展。本文主要针对目前大部分高校校园进出管理方式落后、管理效率低下的状况,结合当前最新......
  • 基于java+Springboot+MySQL微信小程序的大用户心理咨询系统设计与实现99040-计算机原
    目录1绪论1.1研究背景1.2研究现状1.3论文结构与章节安排2 基于微信小程序的大用户心理咨询系统设计与实现分析2.1可行性分析2.2系统功能分析2.3 系统用例分析2.4系统流程分析2.5本章小结3基于微信小程序的大用户心理咨询系统设计与实现总体设计......
  • 探索Spring之利剑:ApplicationContext接口
    嘿,开发者们!你是否曾在构建Spring应用时,感到困惑于那些复杂的配置和神秘的容器?今天,我们将揭开Spring中一个核心接口——ApplicationContext​的神秘面纱。这不仅是一篇技术文章,更是一次深入Spring心脏的探险之旅。系好安全带,我们即将启程!......
  • springboot启动流程
    普通springboot的启动类importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublicclassDemoApplication{publicstaticvoidmain(String[]args){Spri......
  • Springboot计算机毕业设计校刊投稿系统ru0o2
    Springboot计算机毕业设计校刊投稿系统ru0o2本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表项目功能:用户,编辑人员,稿件类型,在线投稿,专家,专家审核,文章分类,文章信息,稿件归档开题报告内容Springboot......
  • 【mybatis】缓存
    目录1.mybatis的运行1.1引言1.2具体运行: 1.3sqlSession介绍localcatch2.缓存2.1概念 2.2使用缓存的原因2.3 什么样的数据能使用缓存3.  Mybatis缓存 3.1一级缓存3.1.1 测试一级缓存3.1.2  缓存失效的四种情况$1 sqlSession不同$2  sqlSes......
  • spring cloud open feign header 参数传递
    consumer配置以下内容```javapackagecom.me.consumer.config;importfeign.RequestInterceptor;importfeign.RequestTemplate;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.spri......