bean循环依赖,spring循环依赖解决方案
00-1010 1前言2 Bean的创建CreateBeanStanCEPULATEBAININITIALIZEBEAN的循环依赖问题概述
00-1010 spring bean factory和FactoryBean之间的区别已经详细描述过了。在本文中,我们将继续解释bean的创建和初始化,这将涉及bean的创建、初始化和循环依赖。
00-1010在上一篇文章中,Spring容器启动的核心方法已经描述为refresh。beans的创建和初始化都是在FinishBeanfactoryinitialization()中处理的。在这个阶段,所有剩余的非惰性加载的单例都被处理。
在这个方法中,调用preInstantiateSingletons()来创建bean的所有单实例bean。在这个过程中,依次获取、初始化容器中的所有Bean并创建对象。获取所有Bean定义信息beanDefinitionNames。在处理bean时,有必要确定bean定义信息是否是抽象的、单例的和延迟加载的。它的核心方法是getBean。可能大家都知道,在获取Bean的过程中,会经历get Bean-DoGetBean-Create Bean-doCreateBean方法的调用链。在Spring源代码中,doXXX方法都是实际业务的方法。在DocreateBean方法中,CreateBeanInstance方法是创建Bean对象的真实方法。在Spring中,使用反射方法来创建对象。这些核心方法都在AbstractTautowireCapableBeanfactory中实现。下图显示了doCreateBean方法、其中的核心操作有三个:CreateBeanstance、populateBean和initializeBean。
目录
CreateBeauty是创建Bean对象的方法,instantiateBean方法最后在这里被调用,最终的调用栈如下:.
abstractautowirecapablebeanfactory . instantiate-simple instantiationstrategy . instantiate-bean utils . instantiate class-ctor . new instance
1 前言
populateBean是设置Bean属性的方法。如下图所示,autowireByName和autowireByType这两个方法是自动注入方法。以autowireByName为例,获取属性就是以getBean的方式从IOC容器中获取对应的Bean。
00-1010初始化Bean是实例化后的操作,初始化前后是BeanPostProcessor的操作,初始化操作是invokeInitMethods的初始化方法。
#在初始化前后执行applybeanpostprocessorsbeforeign initial ization初始化 Bean 的操作。
初始化之前和之后的操作方法:
2 Bean 的创建
循环依赖是绕不开的话题,循环依赖的问题具体的表现形式如下:
在谈论循环依赖的结果之前,它仍然涉及Bean是如何创建的。下图所示的过程就是解决循环依赖的过程。
1创建A对象时,需要在populateBean填充属性时触发获取B对象的操作。这里,对象的构造方法将被放入createBeanInstance方法的三级缓存中。2在一轮getBean和createBean之后,再次执行属性赋值操作populateBean。此时,获取A对象的操作将被再次触发。再次获取A对象时,会从三级缓存创建一个半成品A对象,放入二级缓存,删除三级缓存,返回。此时B对象将被填充属性,赋值完成后放入一级缓存,B对象返回步骤1。3创建A对象的第一步继续。属性赋值完成后,对象将被放入一级缓存,二级缓存将被删除。下图显示了创建Bean的过程。抽象towirecapablebean factory . docreatebean方法的核心内容如下:
获取单例 Bean 的方法:
初始化的方法如下所示:
通过以上三个步骤,解决了循环依赖的问题,完成了创建Bean对象的过程。
为什么要使用三级缓存呢,说到底是要解决以下问题:
1如果采用一级缓存,如果没有循环依赖的问题,确实是可以的。如果存在上图的循环依赖问题,就无法解决,只能通过两级缓存来解决。如果采用两级缓存,确实可以解决一些问题。但是Bean是用AOP表示的,用二级缓存解决不了问题,必须采用三级缓存。
00-1010本文主要描述了Spring容器中Bean创建过程的主要方法,同时也着重分析了循环依赖的问题。
这就是关于Spring-Bean的创建和循环依赖的文章。关于Spring Bean的更多信息,请搜索Popular IT之前的文章或者继续浏览下面的相关文章。我希望你以后能更多地支持流行音乐!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。