循环依赖<wbr>
</wbr>当你主要使用构造器注入的方式配置bean时,很有可能会产生循环依赖的情况。
比如说,一个类A,需要通过构造器注入类B,而类B又需要通过构造器注入类A。如果为类A和B配置的bean被互相注入的话,那么Spring IoC容器将在运行时检测出循环引用,并抛出 BeanCurrentlyInCreationException异常。
对于此问题,一个可能的解决方法就是修改源代码,将构造器注入改为setter注入。另一个解决方法就是完全放弃使用构造器注入,只使用setter注入。
通常情况下,你可以信赖Spring,它会在容器加载时发现配置错误(比如对无效bean的引用以及循环依赖)。Spring会在bean创建的时才去设置属性和依赖关系(只在需要时创建所依赖的其他对象)。Spring容器被正确加载之后,当获取一个bean实例时,如果在创建bean或者设置依赖时出现问题,那么将抛出一个异常。因缺少或设置了一个无效属性而导致抛出一个异常的情况的确是存在的。因为一些配置问题而导致潜在的可见性被延迟,所以在默认情况下,ApplicationContext实现中的bean采用提前实例化的singleton模式。在实际需要之前创建这些bean将带来时间与内存的开销。而这样做的好处就是ApplicationContext被加载的时候可以尽早的发现一些配置的问题。不过用户也可以根据需要采用延迟实例化来替代默认的singleton模式。
最后,我们还要提到的一点就是,当协作bean被注入到依赖bean时,协作bean必须在依赖bean之前
<wbr>完全</wbr><wbr>配置好。例如bean A对bean B存在依赖关系,那么Spring IoC容器在调用bean A的setter方法之前,bean B必须被完全配置,这里所谓
<wbr>完全配置</wbr></wbr><wbr>的意思就是bean将被实例化(如果不是采用提前实例化的singleton模式),相关的依赖也将被设置好,而且所有相关的lifecycle方法(如
IntializingBean</wbr><wbr>的init方法以及callback方法)也将被调用。
(当使用aop时,修改bean的属性为:scope="prototype" ,也许可以解决问题,不推荐相互注入属性 王聪 2008-08-15)
</wbr><wbr style="LINE-HEIGHT: 1.3em">
分享到:
相关推荐
Spring源码最难问题:当Spring AOP遇上循环依赖 Spring源码中最难的问题之一是循环依赖问题,当Spring AOP遇上循环依赖时,该如何解决? Spring通过三级缓存机制解决循环依赖的问题。 在Spring中,bean的实例化...
在Spring框架中,循环依赖是指两个或多个Bean之间形成相互引用的闭环,导致Spring容器在创建这些Bean时陷入无限递归。Spring提供了多种策略来处理这种情况,以确保正常完成Bean的初始化。以下将详细介绍Spring解决...
在Spring Boot应用中,构造器注入是一种常见的依赖注入方式,但它可能会引发循环依赖的问题。循环依赖是指两个或多个Bean之间形成一个闭环,彼此依赖对方,导致Spring容器在初始化Bean时无法确定创建顺序,从而抛出...
Spring循环依赖debug源码图
循环依赖解决过程
《spring源码之循环依赖和三级缓存》整理,本人水平有限,从网上找的资料整合之后做的,请辩证的看待其中内容。
Spring三级缓存解决循环依赖.pdf
在编程领域,循环依赖是一个常见的问题,特别是在对象导向编程中。循环依赖通常指的是两个或多个模块之间形成相互依赖的关系,即模块A依赖于模块B,同时模块B也依赖于模块A。这种关系可能会导致编译错误、运行时异常...
在IT行业中,循环依赖(Circular Dependency)是一个常见的问题,尤其在后端开发中。"LCC"在这里可能指的是"Loop-Closure Constraint"或者某种特定的处理循环依赖的机制。在这个"lcc循环依赖"的重磅资料中,我们可以...
Spring框架在处理循环依赖问题上展现出了其卓越的性能和灵活性。循环依赖是软件设计中常见的问题,特别是在大型Java企业应用中,它可能导致系统僵死或者运行时异常。Spring通过三级缓存机制和AOP代理巧妙地解决了这...
// 关闭循环依赖检查 applicationContext.setAllowCircularReferences(false); applicationContext.refresh(); BookService bookService = (BookService) applicationContext.getBean("bookService"); System.out....
为了彻底掌握 Spring Bean 的循环依赖,我们需要搞清楚四个问题:普通 Bean 的非循环依赖 Bean 生命周期的流程、AOP 代理 Bean 的非循环依赖 Bean 生命周期的流程、普通 Bean 的循环依赖 Bean 生命周期的流程和 AOP ...
在Spring框架中,循环依赖(Circular Dependency)是指两个或多个bean之间形成了一种相互引用的关系,使得它们在初始化过程中无法独立完成实例化。在上述案例中,`AuthorService`依赖于`BookService`,而`...
SpringBean 循环依赖问题与解决方案 SpringBean 循环依赖问题是指在 Spring 框架中,多个 Bean 之间存在相互依赖关系,导致 Bean 创建失败或无法正确注入的问题。这种问题常见于大型项目中,特别是在复杂的业务系统...
Spring Ioc 源码分析系列--自动注入循环依赖的处理 本篇文章主要讲解了 Spring Ioc 源码分析系列中自动注入循环依赖的处理机制。循环依赖是 Spring 框架中一个经典的问题,也是面试中常被问到的问题。本篇文章将...
在Spring框架中,循环依赖是指两个或多个bean之间形成互相依赖的关系,即每个bean都需要另一个bean才能初始化。这种情况下,如果没有妥善处理,会导致初始化过程陷入死循环,进而引发应用程序的异常。Spring通过其...
Spring5.0源码深度解析之SpringBean循环依赖问题解决方案 Spring5.0源码深度解析之SpringBean循环依赖问题解决方案是指在Spring框架中如何解决Bean的循环依赖问题。在Spring框架中,Bean的循环依赖指的是两个或多个...
本文将深入探讨Spring框架的核心特性——依赖注入(Dependency Injection, DI)和面向切面编程(Aspect-Oriented Programming, AOP),以及如何解决循环依赖问题。 首先,依赖注入是Spring框架的核心理念之一,它的...
循环依赖插件与webpack捆绑时,检测具有循环依赖性的模块。 循环依赖关系在复杂软件中通常是必需的,循环依赖关系的存在并不总是意味着存在错误,但是在您认为存在错误的情况下,此模块可能会帮助您找到它。Webpack...