首页 > 其他分享 >Spring 的循环依赖

Spring 的循环依赖

时间:2024-09-22 16:24:24浏览次数:9  
标签:缓存 Spring 循环 代理 Bean 依赖 三级

在 Spring 中,循环依赖是指两个或多个 Bean 相互依赖,导致在创建过程中出现了依赖死锁的问题。为了解决循环依赖,Spring 引入了三级缓存机制。了解为什么需要三级缓存机制,首先要明白循环依赖是如何发生的,以及两级缓存为什么不足够。

一、循环依赖是什么?

假设有两个 Bean AB

  • A 依赖于 B
  • B 依赖于 A

如果没有缓存机制,Spring 在创建 A 时会发现它需要 B,于是去创建 B,但在创建 B 时又发现需要 A,这时就会产生循环依赖,最终导致栈溢出或抛出异常。

二、三级缓存机制

Spring 使用三级缓存(三级依赖处理机制)来解决循环依赖问题,分别是:

  1. 一级缓存singletonObjects,用于存储完全初始化好的单例对象。

    • 完全初始化后的 Bean 会放入一级缓存中,表示该 Bean 已经准备好可以使用了。
  2. 二级缓存earlySingletonObjects,用于存储提前暴露的 Bean,主要是尚未完成依赖注入但已经实例化的 Bean。

    • 这个缓存用于提前暴露尚未完成初始化的 Bean,防止循环依赖无法解决。通常情况下,如果某个 Bean 已经实例化但还没有完成后续的属性填充等操作,它会存放在这个缓存中。
  3. 三级缓存singletonFactories,用于存储 Bean 的 ObjectFactory(对象工厂),这个工厂提供对该 Bean 的代理对象(比如 AOP 代理对象)的创建逻辑。

    • 三级缓存的存在使得 Spring 可以在 Bean 创建的早期阶段将未完全初始化的 Bean 提供出来,尤其是代理对象。这样即使 Bean 还没有完成依赖注入,也能通过工厂获得它的一个早期引用。

三、为什么需要三级缓存?两级不行吗?

假如只使用一级缓存和二级缓存:

  • 一级缓存只存储已经完全初始化好的 Bean,显然无法解决循环依赖问题,因为 Bean 尚未完成初始化时无法放入一级缓存。
  • 二级缓存则存储提前暴露的 Bean,但这通常是直接的原始对象,而不是代理对象。如果应用了 AOP 或者需要创建代理对象的场景中,依赖的 Bean 如果在循环依赖中被提前暴露时,可能无法应用正确的代理。

三级缓存 允许通过 ObjectFactory 这种延迟加载的方式,在需要的时候创建早期引用,包括创建代理对象。这确保了即使在循环依赖中,Spring 也可以在合适的时间点创建完整的代理对象,而不是仅仅提供原始对象。

四、总结

三级缓存机制的关键点在于:

  • 二级缓存不能解决 Bean 代理的问题,特别是在涉及到 AOP 的情况下。
  • 三级缓存通过引入 ObjectFactory,可以确保在代理场景下也能处理循环依赖,提前暴露还未完全初始化的代理对象。

因此,两级缓存不足以解决所有循环依赖问题,特别是在涉及到代理对象的情况下,三级缓存的机制显得非常必要。

4o

标签:缓存,Spring,循环,代理,Bean,依赖,三级
From: https://blog.csdn.net/m0_68570169/article/details/142321174

相关文章

  • Shiro漏洞复现-springboot运行报错的解决 && 项目本地tomcat部署
    一、Springboot项目运行出现的种种问题:首先需要下载环境代码,来源Github等开源平台,下载解压后使用IDEA打开,由于Shiro通常与Springboot项目捆绑,所以通常运行需要Springboot环境,如下图所示:运行时可能会出现如下报错:unabletostartServletWebServerApplicationcontextd......
  • 蜗牛兼职网:Spring Boot框架应用
    摘要随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,蜗牛兼职网当然也不能排除在外。蜗牛兼职网是以实际运用为开发背景,运用软件工程原理和开发方法,采用springboot框架构建的一个管理系统。整个开发过程首先对......
  • 【计算机专业毕设最新Java必过毕设选题2025】基于springboot的高校跳蚤市场管理系统(源
    作品简介 Hi,各位同学好呀!今天向大家分享一个最新完成的高质量毕业设计项目作品基于springboot的XXX管理系统项目评分(最低0分,满分5分)难度系数:3分工作量:5分创新点:3分界面美化:5分使用技术前端:html/js/css后端:springboot数据库:MySql服务器:apache-tomcat......
  • 蜗牛兼职网开发:Spring Boot应用
    第3章系统分析3.1需求分析蜗牛兼职网主要是为了提高工作人员的工作效率和更方便快捷的满足用户和企业,更好存储所有数据信息及快速方便的检索功能,对系统的各个模块是通过许多今天的发达系统做出合理的分析来确定考虑用户和企业的可操作性,遵循开发的系统优化的原则,经过全......
  • spring boot 项目中集成使用 Elasticsearch
    目录前言一、添加依赖二、配置Elasticsearch三、定义实体和仓库四、使用Elasticsearch五、性能和安全优化六、监控和日志七、插件和扩展总结前言在SpringBoot项目中使用Elasticsearch,可以充分发挥Elasticsearch在全文搜索、日志分析、数据索引等方面的......
  • [Spring]过滤器
    过滤器Filter作为Java三大器之一,在JavaWeb的使用中有很高的地位。所谓过滤器,就是实现了javax.servlet.Filter接口的服务器端程序。Filter有如下几个用处:在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest。根据需要检查HttpServletRequest,也可以修改HttpSe......
  • Spring Boot技术栈:蜗牛兼职网案例
    第2章相关技术2.1B/S架构B/S结构的特点也非常多,例如在很多浏览器中都可以做出信号请求。并且可以适当的减轻用户的工作量,通过对客户端安装或者是配置少量的运行软件就能够逐步减少用户的工作量,这些功能的操作主要是由服务器来进行控制的,由于该软件的技术不断成熟,最主要的......
  • [Spring]拦截器
    Interceptor介绍拦截器(Interceptor)同Filter过滤器一样,它俩都是面向切面编程——AOP的具体实现(AOP切面编程只是一种编程思想而已)。你可以使用Interceptor来执行某些任务,例如在Controller处理请求之前编写日志,添加或更新配置......在Spring中,当请求发送到Controller......
  • 美食探索家:Spring Boot校园美食分享网络
    第四章系统实现4.1前台首页功能模块校园周边美食探索及分享平台,在系统首页可以查看首页、美食鉴赏、我的好友、个人中心、后台管理等内容,如图4-1所示。图4-1前台首页功能界面图用户登录、用户注册,在用户注册页面可以填写用户名、姓名、手机、邮箱、身份证等详细内容进......
  • springAOP和spring事务
    AOP1.简介Aop面向切面编程:在开发中我们不能直接对已经设计好的代码进行修改(开放-封闭原则,对扩展开放,对修改封闭),解耦AOP的底层实现为动态代理*Target(目标对象):代理的目标对象*Proxy(代理):一个类被AOP织入增强后,就产生一个结果代理类*Joinpoint(连接点):所谓连接点是指那些......