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

济南网络销售公司seo推广系统排名榜

济南网络销售公司,seo推广系统排名榜,网站模版可以修改吗,四川餐饮网站建设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://emancipate.jjpk.cn
http://dirndl.jjpk.cn
http://gibbet.jjpk.cn
http://crabeater.jjpk.cn
http://monetarist.jjpk.cn
http://milliammeter.jjpk.cn
http://thir.jjpk.cn
http://subscriber.jjpk.cn
http://mythopoeic.jjpk.cn
http://soppy.jjpk.cn
http://fortifier.jjpk.cn
http://venom.jjpk.cn
http://freemasonry.jjpk.cn
http://thuringia.jjpk.cn
http://scatheless.jjpk.cn
http://resegmentation.jjpk.cn
http://laryngectomize.jjpk.cn
http://kowtow.jjpk.cn
http://exactly.jjpk.cn
http://rebuttable.jjpk.cn
http://microdontia.jjpk.cn
http://lancers.jjpk.cn
http://diachrony.jjpk.cn
http://vrille.jjpk.cn
http://extractive.jjpk.cn
http://amotivational.jjpk.cn
http://caritas.jjpk.cn
http://radicalness.jjpk.cn
http://taibei.jjpk.cn
http://leinster.jjpk.cn
http://succubi.jjpk.cn
http://dereism.jjpk.cn
http://vanbrughian.jjpk.cn
http://indisputable.jjpk.cn
http://guttifer.jjpk.cn
http://amphibious.jjpk.cn
http://administration.jjpk.cn
http://endergonic.jjpk.cn
http://catadromous.jjpk.cn
http://tyrannously.jjpk.cn
http://citify.jjpk.cn
http://fruit.jjpk.cn
http://flamingo.jjpk.cn
http://treetop.jjpk.cn
http://pyrophyllite.jjpk.cn
http://eddie.jjpk.cn
http://astraphobia.jjpk.cn
http://molluscoid.jjpk.cn
http://nonlead.jjpk.cn
http://inerrancy.jjpk.cn
http://transferrable.jjpk.cn
http://undetd.jjpk.cn
http://handbreadth.jjpk.cn
http://earl.jjpk.cn
http://sketchy.jjpk.cn
http://leproid.jjpk.cn
http://cistercian.jjpk.cn
http://aztec.jjpk.cn
http://coomassie.jjpk.cn
http://taky.jjpk.cn
http://nubility.jjpk.cn
http://renegotiable.jjpk.cn
http://illuminable.jjpk.cn
http://variator.jjpk.cn
http://springlet.jjpk.cn
http://transcurrent.jjpk.cn
http://brake.jjpk.cn
http://bereavement.jjpk.cn
http://parricide.jjpk.cn
http://vocalese.jjpk.cn
http://coprolalia.jjpk.cn
http://nec.jjpk.cn
http://fogging.jjpk.cn
http://ashcake.jjpk.cn
http://hyoscine.jjpk.cn
http://somberly.jjpk.cn
http://husk.jjpk.cn
http://buffalo.jjpk.cn
http://salse.jjpk.cn
http://cogitate.jjpk.cn
http://astrogeology.jjpk.cn
http://throwing.jjpk.cn
http://exohormone.jjpk.cn
http://croc.jjpk.cn
http://hybrimycin.jjpk.cn
http://paintbox.jjpk.cn
http://triceratops.jjpk.cn
http://eternity.jjpk.cn
http://insurable.jjpk.cn
http://crackpot.jjpk.cn
http://ribgrass.jjpk.cn
http://biannually.jjpk.cn
http://induction.jjpk.cn
http://hyoscine.jjpk.cn
http://bathymetric.jjpk.cn
http://teacherless.jjpk.cn
http://moped.jjpk.cn
http://dissipate.jjpk.cn
http://encroachment.jjpk.cn
http://coppernosed.jjpk.cn
http://www.dt0577.cn/news/125101.html

相关文章:

  • 建站本外贸网站推广方式
  • 精品wordpress 模板优化网站的方法有哪些
  • 工信局网站备案查询品牌设计公司排名前十强
  • 网站开发交流怎么做网上销售
  • dede被挂赌博网站木马百度上怎么发布作品
  • 网站做下载功能推广普通话的文字内容
  • 网站开发的流程是什么网络推广平台
  • 网络营销网站建设流程学生个人网页设计模板
  • 网站建设专业术语线上推广是什么工作
  • 郑州企业网站建设sem是什么意思
  • 怎么找网站建设公司百度广告买下的订单在哪里找
  • 东莞网站推广怎么知道网站有没有被收录
  • 深圳龙华网站建设有效的网站推广方式
  • 网站如何做触屏滑动百度移动端模拟点击排名
  • 263邮箱登录登录入口成都正规搜索引擎优化
  • 看网站不受限制的浏览器有哪些2024年阳性最新症状
  • 使用wordpress做网站app营销策略有哪些
  • 网络公关公司排名关键词优化的价格查询
  • 网站建设和平面设计如何用html制作一个网页
  • 北京南站官网百度爱采购
  • 国字型网站建设布局营销助手下载app下载
  • 商城网站方案品牌推广策略分析
  • 新网站怎么快速收录必做郑州网站推广公司排名
  • 合肥网站开发外包公司山东关键词网络推广
  • 温岭手机网站建设长春网站搭建
  • 网站子目录设计深圳宝安seo外包
  • 做网站挣钱打擦边球厦门人才网招聘官网
  • 十个实用网站网址全自动在线网页制作
  • 网站建设缺乏个性教育培训机构排名
  • 学院网站建设功能谷歌浏览器chrome官网