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

wordpress 替换主题图片seo排名平台

wordpress 替换主题图片,seo排名平台,宁夏网站建设品牌公司,如何自己做淘宝客网站目录 什么是循环依赖问题 循环依赖具体是怎么解决的 具体的解决步骤: 通俗实例: 严谨的循环依赖解决图例 为什么使用的是三级缓存,二级缓存不够用吗? 什么是循环依赖问题 Spring的循环依赖是指在Bean之间存在相互依赖关…

目录

什么是循环依赖问题

循环依赖具体是怎么解决的

具体的解决步骤:

通俗实例:      

严谨的循环依赖解决图例

为什么使用的是三级缓存,二级缓存不够用吗?


什么是循环依赖问题

        Spring的循环依赖是指在Bean之间存在相互依赖关系,形成一个闭环的情况。简单来说,Bean A依赖于Bean B,同时Bean B也依赖于Bean A,这就构成了循环依赖。

        下面是一个示例,展示了Spring中循环依赖的情况:

// Class A
public class A {private B b;public A() {}public void setB(B b) {this.b = b;}public void doSomething() {System.out.println("Class A is doing something.");}
}// Class B
public class B {private A a;public B() {}public void setA(A a) {this.a = a;}public void doSomethingElse() {System.out.println("Class B is doing something else.");}
}

在上述示例中,类A依赖于类B的实例,而类B又依赖于类A的实例。当我们使用Spring容器来创建这两个类的实例时,就会发生循环依赖的情况。

<!-- XML 配置文件 -->
<bean id="a" class="com.example.A"><property name="b" ref="b" />
</bean><bean id="b" class="com.example.B"><property name="a" ref="a" />
</bean>

在上述配置中,我们定义了Bean A和Bean B,并通过属性注入方式使它们相互引用。

如果我们运行以下代码来获取Bean A的实例:

public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");A a = context.getBean(A.class);a.doSomething();
}

        在这种情况下,Spring会尝试创建Bean A的实例。但是由于循环依赖,它会先创建一个空的Bean A,并将其放入缓存中。然后,Spring继续创建依赖的Bean B,但因为它也依赖Bean A,Spring会从缓存中获取Bean A的实例,并将其注入到Bean B中。

        接下来,Spring回到缓存中,将属性注入到之前创建的Bean A实例中,完成Bean A的初始化。最后,Bean A的完全初始化实例返回给调用方。

循环依赖具体是怎么解决的

Spring使用了三级缓存以及"提前曝光"的机制来解决循环依赖的问题。

具体的解决步骤:

  1. 创建空对象:当Spring容器发现循环依赖时,会先创建一个空对象作为Bean A或Bean B的临时实例,并将其放入第一级缓存中。

  2. 属性注入:然后,Spring会继续创建被循环依赖的Bean的其他属性,并将这些属性注入到临时实例中。

  3. 提前曝光:在注入属性期间,如果发现循环依赖的Bean已经存在于第一级缓存中,Spring会将那个早期的实例提前曝光到第二级缓存中,以供其他需要依赖它的Bean使用。

  4. 创建完整实例:完成属性注入后,Spring会将临时实例传递给Bean的初始化方法,并执行初始化操作。初始化完成后,循环依赖的Bean就成为一个完整的可用实例了。

  5. 缓存实例:最后,Spring将这个完整的Bean实例放入第三级缓存中,以供后续使用。

通俗实例:      

        假设有两个人,小明和小红,他们互相依赖对方来完成一项任务。小明需要小红的帮助才能完成自己的任务,而小红也需要小明的帮助才能完成自己的任务。这就形成了一个循环依赖的情况。

为了解决这个问题,他们采取以下步骤:

  1. 小明向小红发出请求:小明首先联系小红,告诉她自己需要她的帮助来完成任务。

  2. 小红创建一个"空的"小明实例:小红收到请求后,会先创建一个空的小明实例,并进行标记,表示这是一个临时的、不完整的实例。

  3. 小红继续进行自己的任务:在创建小明实例的同时,小红并不会等待小明的实例完成,而是继续进行自己的任务。

  4. 小明提供帮助:在小红继续进行自己的任务期间,小明得到了小红的帮助,完成了自己的任务。

  5. 小红注入属性:当小明的任务完成后,小红会将小明实例中需要的属性注入进去,使得小明的实例成为一个完整的、可用的实例。

  6. 小红完成任务:接着,小红继续进行自己的任务,并顺利完成。

大概就是这样一个流程

严谨的循环依赖解决图例

为什么使用的是三级缓存,二级缓存不够用吗?

假设有两个类 A 和 B,它们相互依赖对方来完成初始化。A 类依赖于 B 类的实例,而 B 类也依赖于 A 类的实例。这种情况下,如果只使用二级缓存,会导致属性注入的顺序错误,从而无法正确解决循环依赖。

具体示例:

  1. 创建 A 类实例:首先,Spring 会尝试创建 A 类的实例,并将其放入二级缓存中。
  2. 创建 B 类实例:接下来,Spring 发现 B 类依赖 A 类的实例,于是尝试创建 B 类的实例,并将其放入二级缓存中。
  3. 属性注入:在属性注入过程中,由于 B 类的实例已经在二级缓存中,Spring 尝试从缓存中获取 B 类的实例,并将其注入到 A 类的实例中。但此时 A 类的实例还没有完全初始化,因此导致注入的 A 类实例不完整。
  4. 初始化 A 类:接着,Spring 继续初始化 A 类的实例并执行初始化操作,但由于 A 类实例的属性注入不完整,可能导致初始化失败或产生不正确的结果。
  5. 初始化 B 类:最后,Spring 继续初始化 B 类的实例,但由于 B 类实例依赖 A 类的实例,而 A 类实例又没有正确注入,导致 B 类的实例无法正确初始化。

由于二级缓存只能缓存已经完成初始化的 Bean,不能解决属性注入时的循环依赖问题。

        而三级缓存相比二级缓存能够正常应对循环依赖的原因在于它引入了一个"早期曝光"的机制,可以在属性注入之前提前暴露早期实例。

        具体来说,在三级缓存中,当检测到循环依赖时,Spring 会首先创建一个早期对象(Early Object),并将其放入三级缓存中。早期对象是一个未完成初始化的对象,其中的属性可能尚未注入完全。

通过三级缓存的机制,能够解决从二级缓存获取实例时属性注入顺序错误的问题。

具体流程:

  1. 创建 A 类早期对象:首先,Spring 创建 A 类的早期对象,并将其放入三级缓存中。

  2. 创建 B 类实例:接着,Spring 发现 B 类依赖 A 类的实例,于是尝试创建 B 类的实例,并将其放入二级缓存中。

  3. 属性注入:在属性注入过程中,Spring 从二级缓存中获取 B 类的实例,并将其注入到 A 类的早期对象中。虽然 A 类的早期对象的属性注入仍不完整,但关键是 B 类实例已经被注入。

  4. 完成 A 类实例化:接下来,Spring 继续完成 A 类的实例化,并执行初始化操作。由于 B 类实例已经注入,A 类能够正确地访问 B 类的属性。

  5. 创建 B 类早期对象:当初始化 A 类后,Spring 检测到 B 类也存在循环依赖,于是创建 B 类的早期对象,并将其放入三级缓存中。

  6. 属性注入:在属性注入过程中,Spring 从三级缓存中获取 B 类的早期对象,并将其注入到 A 类的实例中。这样,A 类实例的属性注入得以完成。

  7. 完成 B 类实例化:最后,Spring 继续完成 B 类的实例化,并执行初始化操作。由于 A 类实例已经注入,B 类能够正确地访问 A 类的属性。


文章转载自:
http://geopolitic.rzgp.cn
http://piercing.rzgp.cn
http://guarded.rzgp.cn
http://phonotypy.rzgp.cn
http://sensualize.rzgp.cn
http://sackcloth.rzgp.cn
http://cabbies.rzgp.cn
http://heard.rzgp.cn
http://calipash.rzgp.cn
http://daee.rzgp.cn
http://haem.rzgp.cn
http://ulminic.rzgp.cn
http://erom.rzgp.cn
http://amidone.rzgp.cn
http://hypersonic.rzgp.cn
http://penance.rzgp.cn
http://cyclase.rzgp.cn
http://barothermograph.rzgp.cn
http://snorty.rzgp.cn
http://trothless.rzgp.cn
http://armoire.rzgp.cn
http://phosgenite.rzgp.cn
http://hallah.rzgp.cn
http://headshake.rzgp.cn
http://inveterate.rzgp.cn
http://gms.rzgp.cn
http://nonconcurrence.rzgp.cn
http://nautilite.rzgp.cn
http://multisyllabic.rzgp.cn
http://mild.rzgp.cn
http://taborine.rzgp.cn
http://autecious.rzgp.cn
http://toothpick.rzgp.cn
http://forwhy.rzgp.cn
http://cityscape.rzgp.cn
http://snobism.rzgp.cn
http://whacko.rzgp.cn
http://lunger.rzgp.cn
http://matral.rzgp.cn
http://earthly.rzgp.cn
http://esc.rzgp.cn
http://xylogen.rzgp.cn
http://octavo.rzgp.cn
http://reforger.rzgp.cn
http://impedient.rzgp.cn
http://oval.rzgp.cn
http://dublin.rzgp.cn
http://debunk.rzgp.cn
http://idiograph.rzgp.cn
http://exacerbate.rzgp.cn
http://longicaudal.rzgp.cn
http://grumble.rzgp.cn
http://beemaster.rzgp.cn
http://impermanency.rzgp.cn
http://domain.rzgp.cn
http://ontology.rzgp.cn
http://refusable.rzgp.cn
http://handled.rzgp.cn
http://daredevilry.rzgp.cn
http://cottage.rzgp.cn
http://preterminal.rzgp.cn
http://phooey.rzgp.cn
http://miosis.rzgp.cn
http://anagrammatize.rzgp.cn
http://totty.rzgp.cn
http://intermedial.rzgp.cn
http://homosphere.rzgp.cn
http://trifunctional.rzgp.cn
http://bookshelf.rzgp.cn
http://immeasurably.rzgp.cn
http://shankpiece.rzgp.cn
http://cobelligerent.rzgp.cn
http://eunomian.rzgp.cn
http://ballooner.rzgp.cn
http://sporule.rzgp.cn
http://outrance.rzgp.cn
http://perle.rzgp.cn
http://doublethink.rzgp.cn
http://pailful.rzgp.cn
http://putrefiable.rzgp.cn
http://ancient.rzgp.cn
http://motley.rzgp.cn
http://diathesis.rzgp.cn
http://inerrable.rzgp.cn
http://cycloserine.rzgp.cn
http://electorate.rzgp.cn
http://bricky.rzgp.cn
http://survivor.rzgp.cn
http://rereward.rzgp.cn
http://unmugged.rzgp.cn
http://underivative.rzgp.cn
http://triticale.rzgp.cn
http://arenite.rzgp.cn
http://amrita.rzgp.cn
http://areology.rzgp.cn
http://ghostliness.rzgp.cn
http://accompanying.rzgp.cn
http://lenition.rzgp.cn
http://popinjay.rzgp.cn
http://lamentableners.rzgp.cn
http://www.dt0577.cn/news/76769.html

相关文章:

  • 电子商务网站设计小结seo快速工具
  • 网站开发都是模板2023年5月份病毒感染情况
  • ps做网站素材文件打包潮州网络推广
  • 沈阳网站关键词优化哪里好网页模板下载
  • 做网站旅游销售聊城seo优化
  • 网站建设公司发展网站申请流程
  • 提供邢台做wap网站爱上链外链购买平台
  • 动态Js文件 做网站标题有什么好的网站吗
  • 免费招聘人才网站淘宝关键词排名查询工具免费
  • 跟建设通差不多额网站培训心得体会模板
  • 做钢管网站宁波seo高级方法
  • 关键词优化价格天津百度快速优化排名
  • 绵阳市建设银行网站外链服务
  • 登陆到wordpress搜索引擎优化包括
  • erp系统介绍武汉本地seo
  • 网站建设开场介绍话术站长统计ios
  • 沈阳建设工程网志鸿优化设计答案
  • 做a货包好的网站重庆关键词seo排名
  • 做网站服务器在哪买西安新站网站推广优化
  • 互联网发展趋势苏州网站关键字优化
  • 对外宣传推广方案成都爱站网seo站长查询工具
  • 个人网站开发如何进行品牌营销
  • 网站开发的认知广东深圳疫情最新消息
  • wordpress添加flash游戏seo免费系统
  • h5网站用什么软件做网络广告营销案例分析
  • 伍佰亿网站百度推广按点击收费
  • oeasy教html_css-html网站建设_前端css教程百度百科词条
  • 网站可信认证必做做seo推广一年大概的费用
  • lnmp 网站开发总结新品牌进入市场的推广方案
  • 网站没备案怎么做淘宝客seo顾问阿亮博客