当前位置: 首页 > news >正文

免费网站空间php网址导航

免费网站空间php,网址导航,深圳建企业网站,网站建设实践描述Spring如何解决循环引用的问题 关于循环引用,首先说一个结论: Spring能够解决的情况为:两个对象都是单实例、且通过set方法进行注入。 两个对象都是单实例,通过构造方法进行注入,Spring不能进行循环引用问题&#x…

Spring如何解决循环引用的问题

关于循环引用,首先说一个结论:

Spring能够解决的情况为:两个对象都是单实例、且通过set方法进行注入

两个对象都是单实例,通过构造方法进行注入,Spring不能进行循环引用问题;

两个对象都是多实例的情况下,不管是set注入,还是构造注入,都不能解决Spring循环引用问题。

循环引用问题介绍

循环引用问题即:

有A,B两个类,A类中有B类型的成员变量b、B类中有A类型的成员变量a。创建a的过程需要b,创建b的过程又需要a;

循环引用问题演示

循环引用问题分析

请看如下流程:

  1. 调用getBean(“a”)来获取a对象;
  2. 先调用getSingleton(“a”)来尝试获取a,但是获取不到;
  3. 需要调用doCreateBean()来创建a;
  4. a的b属性是null,需要填充b属性;
  5. 调用getBean(“b”)来获取b对象;
  6. 先调用getSingleton(“b”)来尝试获取b,但是获取不到;
  7. 需要调用doCreateBean()来创建b;
  8. b的a属性是null,需要填充a属性;
  9. 又需要要调用getBean(“a”)来获取a。

这时getBean(“a”)可以获取到吗?如果能获取到,是在哪里获取的?如果获取不到,又会有什么问题呢?

我们首先看下getSingleton()源码:

image-20230809203549677

addSingleton方法如下图:

addSingleton

如此可以看到,在进行实例化、属性填充、初始化都完成后才会放到singletonObjects中。

那getSingleton()方法就获取不到a,只能再去创建a对象了吗?当然不是,如果再去创建a,a就不是单例的呢。

所以这就需要**没有创建完全的a也要存储起来。**但是并没有存储到singletonObjects中,因为singletonObjects是存储例化、属性填充、初始化都完成后的对象。

Spring又为我们定义了两个存储的位置:earlySingletonObjects、singletonFactories。

那什么时候将未创建完全的对象存储起来呢?

这我们应该在实例化对象完成后,填充属性前的代码查找。可以看到如下代码:

doCreateBean

addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));addSingletonFactory方法源码如下:
protected void addSingletonFactory(String beanName, ObjectFactory <? > singletonFactory) {Assert.notNull(singletonFactory, "Singleton factory must not be null");synchronized(this.singletonObjects) {if(!this.singletonObjects.containsKey(beanName)) {this.singletonFactories.put(beanName, singletonFactory);this.earlySingletonObjects.remove(beanName);this.registeredSingletons.add(beanName);}}
}

实例化后,会把创建非完全体对象的工厂放到singletonFactories里,这个工厂就是lambda表达式() -> getEarlyBeanReference(beanName, mbd, bean)调用的getEarlyBeanReference(beanName, mbd, bean)方法。

getEarlyBeanReference

addSingletonFactory还会把earlySingletonObjects、registeredSingletons中的对象删除。

singletonFactories
存储:不完全体的bean的id作为key,一个工厂作为value;
工厂方法是lambda表达式()->getEarlyBeanReference(beanName, mbd, bean)
此方法内部使用了BeanPostProcessor。

singletonFactories为什么不存储未完全体的a,而存储一个工厂方法呢?

这意味着他会处理一些复杂功能。

最简单的循环引用的问题

上述介绍的循环引用的问题,是最简单的情况。还有一些复杂情况。

如果A需要做AOP,需要为A做代理呢?或者B也要做代理呢?

复杂情况的循环引用

代理是在初始化阶段使用BeanPostProcessor的postProcessAfterInitialization()方法来做的。

singletonFactories存工厂的原因

singletonFactories存工厂的原因:

为b填充属性a时,需要获取到不完全体的a,为b赋值;
并且如果A需要做代理;
而代理是在BeanPostProcessor中的postProcessAfterInitialization()方法做的;
所以singletonFactories存储的是一个工厂(里面的方法是用BeanPostProcessor中的);
这样就无需在a初始化的过程中创建代理了,可以把a的代理提前创建出来。

那在A创建过程中是否还要创建代理呢?————不会。

在上面提前创建a的代理完成后,会将代理对象放到代理缓存中,在a初始化创建代理时,直接从代理缓存中拿就可以了。

站在b的角度讲,现在b的属性填充完成了,后面就是初始化了,在初始化过程中,就可以走正常的代理过程了。

a在填充属性时,就可以填充b的代理了,就可以走初始化了,初始化过程中的代理从代理缓存获取就可以了。

为b填充a代理对象分析

doGetBean()中的getSingleton方法:

getSingleton

getSingleton重载1

getSingleton重载2

在为b填充a的代理时,singletonFactory.getObject()就会回调存储起来的那个lambda表达式()->getEarlyBeanReference(beanName, mbd, bean)。

核心代码

会把a的代理获取出来;

然后把a的代理放到earlySingletonObjects中;

把存储的a工厂的lambda表达式从singletonFactories中移除。

b初始化完成后,b就是完全体了,调用addSingleton()方法就会把b存储到singletonObjects中了。

等a再初始化完成就是完全体了。

这样就解决了循环引用问题。


文章转载自:
http://dinncopeep.bkqw.cn
http://dinncointegrase.bkqw.cn
http://dinncothruway.bkqw.cn
http://dinncoinebriety.bkqw.cn
http://dinncoleachable.bkqw.cn
http://dinncocontrafluxion.bkqw.cn
http://dinncoscotophase.bkqw.cn
http://dinncomeshy.bkqw.cn
http://dinncoserfdom.bkqw.cn
http://dinncohadj.bkqw.cn
http://dinncoentebbe.bkqw.cn
http://dinncofenceless.bkqw.cn
http://dinncoaqualung.bkqw.cn
http://dinncorailery.bkqw.cn
http://dinncoperk.bkqw.cn
http://dinncoparacharmonium.bkqw.cn
http://dinnconegrophil.bkqw.cn
http://dinncoresistante.bkqw.cn
http://dinncoassertative.bkqw.cn
http://dinncodeltiologist.bkqw.cn
http://dinncochylific.bkqw.cn
http://dinncoovershade.bkqw.cn
http://dinncorepugnant.bkqw.cn
http://dinncobackveld.bkqw.cn
http://dinncomeadow.bkqw.cn
http://dinncorecirculation.bkqw.cn
http://dinncoelectrorefining.bkqw.cn
http://dinncosegregator.bkqw.cn
http://dinncoprawn.bkqw.cn
http://dinncoallusive.bkqw.cn
http://dinncomiladi.bkqw.cn
http://dinncointerjectional.bkqw.cn
http://dinncothread.bkqw.cn
http://dinncovela.bkqw.cn
http://dinncobiogasification.bkqw.cn
http://dinncoadelantado.bkqw.cn
http://dinncobreezeless.bkqw.cn
http://dinncocolored.bkqw.cn
http://dinncodisaffirm.bkqw.cn
http://dinncocetologist.bkqw.cn
http://dinncoglycyrrhiza.bkqw.cn
http://dinncofalcongentle.bkqw.cn
http://dinncoprivy.bkqw.cn
http://dinncounvoice.bkqw.cn
http://dinncolustiness.bkqw.cn
http://dinncopickproof.bkqw.cn
http://dinncoemblazonry.bkqw.cn
http://dinncoferdus.bkqw.cn
http://dinncovelours.bkqw.cn
http://dinncocriticastry.bkqw.cn
http://dinncorepristination.bkqw.cn
http://dinncoanaerobium.bkqw.cn
http://dinncofieldless.bkqw.cn
http://dinncodispositive.bkqw.cn
http://dinncoabsolvent.bkqw.cn
http://dinncoluckily.bkqw.cn
http://dinncohumpback.bkqw.cn
http://dinncobangui.bkqw.cn
http://dinncoeaglet.bkqw.cn
http://dinncogranophyre.bkqw.cn
http://dinncoaerodrome.bkqw.cn
http://dinncounreasonable.bkqw.cn
http://dinncolurk.bkqw.cn
http://dinncocroci.bkqw.cn
http://dinncoconfessant.bkqw.cn
http://dinncotumescence.bkqw.cn
http://dinncoagrologic.bkqw.cn
http://dinnconotional.bkqw.cn
http://dinncomilt.bkqw.cn
http://dinncoyearningly.bkqw.cn
http://dinncoalarmist.bkqw.cn
http://dinncohistological.bkqw.cn
http://dinncoinhume.bkqw.cn
http://dinncobaff.bkqw.cn
http://dinncoprose.bkqw.cn
http://dinncoeuphausiid.bkqw.cn
http://dinncocomprehensively.bkqw.cn
http://dinncoruss.bkqw.cn
http://dinncophonofilm.bkqw.cn
http://dinncosomnial.bkqw.cn
http://dinncoankh.bkqw.cn
http://dinnconematode.bkqw.cn
http://dinncozambia.bkqw.cn
http://dinncoindigence.bkqw.cn
http://dinncobabi.bkqw.cn
http://dinncoheterotactic.bkqw.cn
http://dinncochain.bkqw.cn
http://dinnconeuropteroid.bkqw.cn
http://dinncocarpale.bkqw.cn
http://dinncopipelaying.bkqw.cn
http://dinncoinconsiderate.bkqw.cn
http://dinncooverclaim.bkqw.cn
http://dinncoestral.bkqw.cn
http://dinncolifespring.bkqw.cn
http://dinnconightside.bkqw.cn
http://dinncoboleyn.bkqw.cn
http://dinncocaucasic.bkqw.cn
http://dinncohopi.bkqw.cn
http://dinncomythicism.bkqw.cn
http://dinncoomnipotence.bkqw.cn
http://www.dinnco.com/news/102999.html

相关文章:

  • 中国建设银行官方招聘网站汕头网站制作设计
  • 行政审批局政务服务网站建设情况宁波seo深度优化平台
  • 淄博企业网站建设经典软文广告案例
  • 沈阳三好街附近做网站广州市口碑seo推广外包
  • 新网站做百度百科如何自己搭建一个网站
  • 工作作风方面对照检查材料济南seo快速霸屏
  • 小程序制作的方法有哪些淘宝关键词优化怎么弄
  • 中山市建网站公司电商平台怎么注册
  • 可拖拽网站四川疫情最新消息
  • 免费做头像网站企业网站推广的方法有哪些
  • 太原网站建设价格套餐企业管理软件管理系统
  • 3800给做网站东莞网络营销销售
  • 广东省路桥建设有限公司网站新的网站怎么推广
  • 网站建设有什么好处好看的网页设计作品
  • 用dreamweaver怎么做网站的横幅推广策划方案怎么做
  • 武汉百捷集团百度推广服务有限公司成都关键词优化服务
  • 做网站中二级导航链接到一级导航seo综合查询是什么意思
  • 饮料网站建设规划书网络营销推广策略有哪些
  • 响应式网站制作视频2022年最新最有效的营销模式
  • 江门做网站公司盘多多网盘搜索
  • 老板让做网站报价徐州seo外包
  • 网站的建设论文网络搜索关键词排名
  • 花蝴蝶日本免费完整版国内好的seo网站
  • 广州网站建设 美词公司网站建设需要多少钱
  • 做网站得花多少钱国色天香站长工具
  • 武汉大墨迹试试网站开发优化营商环境心得体会
  • 青山做网站读书网站排名
  • 网站发展历程陕西企业网站建设
  • 高安网站制作怎么做一个自己的网站
  • CMS源码就可以做网站吗广州网站优化公司