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

运动网站建设主题毕设做音乐网站

运动网站建设主题,毕设做音乐网站,精准营销定义,网络安全培训目录 什么是循环依赖问题 循环依赖具体是怎么解决的 具体的解决步骤#xff1a; 通俗实例#xff1a; 严谨的循环依赖解决图例 为什么使用的是三级缓存#xff0c;二级缓存不够用吗#xff1f; 什么是循环依赖问题 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 ida classcom.example.Aproperty nameb refb / /beanbean idb classcom.example.Bproperty namea refa / /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 ASpring会从缓存中获取Bean A的实例并将其注入到Bean B中。 接下来Spring回到缓存中将属性注入到之前创建的Bean A实例中完成Bean A的初始化。最后Bean A的完全初始化实例返回给调用方。 循环依赖具体是怎么解决的 Spring使用了三级缓存以及提前曝光的机制来解决循环依赖的问题。 具体的解决步骤 创建空对象当Spring容器发现循环依赖时会先创建一个空对象作为Bean A或Bean B的临时实例并将其放入第一级缓存中。 属性注入然后Spring会继续创建被循环依赖的Bean的其他属性并将这些属性注入到临时实例中。 提前曝光在注入属性期间如果发现循环依赖的Bean已经存在于第一级缓存中Spring会将那个早期的实例提前曝光到第二级缓存中以供其他需要依赖它的Bean使用。 创建完整实例完成属性注入后Spring会将临时实例传递给Bean的初始化方法并执行初始化操作。初始化完成后循环依赖的Bean就成为一个完整的可用实例了。 缓存实例最后Spring将这个完整的Bean实例放入第三级缓存中以供后续使用。 通俗实例       假设有两个人小明和小红他们互相依赖对方来完成一项任务。小明需要小红的帮助才能完成自己的任务而小红也需要小明的帮助才能完成自己的任务。这就形成了一个循环依赖的情况。 为了解决这个问题他们采取以下步骤 小明向小红发出请求小明首先联系小红告诉她自己需要她的帮助来完成任务。 小红创建一个空的小明实例小红收到请求后会先创建一个空的小明实例并进行标记表示这是一个临时的、不完整的实例。 小红继续进行自己的任务在创建小明实例的同时小红并不会等待小明的实例完成而是继续进行自己的任务。 小明提供帮助在小红继续进行自己的任务期间小明得到了小红的帮助完成了自己的任务。 小红注入属性当小明的任务完成后小红会将小明实例中需要的属性注入进去使得小明的实例成为一个完整的、可用的实例。 小红完成任务接着小红继续进行自己的任务并顺利完成。 大概就是这样一个流程 严谨的循环依赖解决图例 为什么使用的是三级缓存二级缓存不够用吗 假设有两个类 A 和 B它们相互依赖对方来完成初始化。A 类依赖于 B 类的实例而 B 类也依赖于 A 类的实例。这种情况下如果只使用二级缓存会导致属性注入的顺序错误从而无法正确解决循环依赖。 具体示例 创建 A 类实例首先Spring 会尝试创建 A 类的实例并将其放入二级缓存中。创建 B 类实例接下来Spring 发现 B 类依赖 A 类的实例于是尝试创建 B 类的实例并将其放入二级缓存中。属性注入在属性注入过程中由于 B 类的实例已经在二级缓存中Spring 尝试从缓存中获取 B 类的实例并将其注入到 A 类的实例中。但此时 A 类的实例还没有完全初始化因此导致注入的 A 类实例不完整。初始化 A 类接着Spring 继续初始化 A 类的实例并执行初始化操作但由于 A 类实例的属性注入不完整可能导致初始化失败或产生不正确的结果。初始化 B 类最后Spring 继续初始化 B 类的实例但由于 B 类实例依赖 A 类的实例而 A 类实例又没有正确注入导致 B 类的实例无法正确初始化。 由于二级缓存只能缓存已经完成初始化的 Bean不能解决属性注入时的循环依赖问题。 而三级缓存相比二级缓存能够正常应对循环依赖的原因在于它引入了一个早期曝光的机制可以在属性注入之前提前暴露早期实例。 具体来说在三级缓存中当检测到循环依赖时Spring 会首先创建一个早期对象Early Object并将其放入三级缓存中。早期对象是一个未完成初始化的对象其中的属性可能尚未注入完全。 通过三级缓存的机制能够解决从二级缓存获取实例时属性注入顺序错误的问题。 具体流程 创建 A 类早期对象首先Spring 创建 A 类的早期对象并将其放入三级缓存中。 创建 B 类实例接着Spring 发现 B 类依赖 A 类的实例于是尝试创建 B 类的实例并将其放入二级缓存中。 属性注入在属性注入过程中Spring 从二级缓存中获取 B 类的实例并将其注入到 A 类的早期对象中。虽然 A 类的早期对象的属性注入仍不完整但关键是 B 类实例已经被注入。 完成 A 类实例化接下来Spring 继续完成 A 类的实例化并执行初始化操作。由于 B 类实例已经注入A 类能够正确地访问 B 类的属性。 创建 B 类早期对象当初始化 A 类后Spring 检测到 B 类也存在循环依赖于是创建 B 类的早期对象并将其放入三级缓存中。 属性注入在属性注入过程中Spring 从三级缓存中获取 B 类的早期对象并将其注入到 A 类的实例中。这样A 类实例的属性注入得以完成。 完成 B 类实例化最后Spring 继续完成 B 类的实例化并执行初始化操作。由于 A 类实例已经注入B 类能够正确地访问 A 类的属性。
http://www.w-s-a.com/news/904013/

相关文章:

  • 网站建设的网络技术app下载平台哪个好
  • 中国建筑人才网是什么网站导购网站制作
  • 网站建设开票东莞龙岗网站建设
  • 17网站一起做网批最近湘潭的新闻
  • 专业网站设计专业服务网站news怎么做
  • 杭州租房网站建设设计网站架构
  • 安徽做网站公司哪家好建设网站需要什么内容
  • 哪些网络公司可以做机票预订网站网站新闻后台怎么做
  • 微网站 域名企业网站怎么做推广
  • 兴安盟住房和城乡建设部网站在国外做网站
  • 南雄市建设局网站搜索关键词的方法
  • 网站建设维护工作经验深圳定制展会
  • 新闻类网站备案WordPress评论昵称显示错误
  • 如何建立一个个人网站自己做一个购物网站
  • 吴忠网站建设公司中国建筑股份有限公司 官网
  • 深圳电商网站开发公司page list wordpress
  • 长安外贸网站建设顺德区网站设计建设企业
  • 临沂市建设局网站简介专业建设网站开发
  • 肇庆网站制作设计中国企业500强招聘
  • 苏州厂房装修宁波seo网络推广外包报价
  • 文山知名网站建设惠州哪家做网站好
  • 物流网站风格网站登录密码保存在哪里设置
  • 免费网站怎么建立icodepython基础教程
  • 无障碍网站建设方案wordpress 任务管理系统
  • iis5.1发布网站中小企业网络营销存在的问题研究论文
  • 阳泉软件定制网站建设网站可以做多语言的吗
  • 建设网站的目的及功能定位主要包括哪些内容百度关键词优化
  • 开一个小程序要多少钱宁波seo网络推广外包报价
  • 网站备案最新备案号电子商务网站建设的规章制度
  • wordpress制作单页网站导航页面鞍山信息港招聘信息