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

wordpress打开慢 cdn系统清理优化工具

wordpress打开慢 cdn,系统清理优化工具,asp.net 网站建设方案,wordpress 资源文件引言 在复杂的应用开发中,循环依赖是一个常见的问题。简单来说,循环依赖是指两个或多个Bean之间互相依赖,导致程序无法正常实例化这些Bean。Spring容器通过依赖注入(DI)来管理Bean的创建与生命周期,并在遇…

引言

在复杂的应用开发中,循环依赖是一个常见的问题。简单来说,循环依赖是指两个或多个Bean之间互相依赖,导致程序无法正常实例化这些Bean。Spring容器通过依赖注入(DI)来管理Bean的创建与生命周期,并在遇到循环依赖时采取了多种策略进行处理。本篇文章将带你实现三种解决循环依赖的方式,包括构造函数注入、Setter注入和ObjectFactory方式,并对比Spring的循环依赖处理机制,帮助你理解不同的处理方式及其应用场景。

什么是循环依赖

循环依赖(Circular Dependency)是指两个或多个Bean互相依赖,导致它们无法正常实例化。通常情况下,Spring通过依赖注入来管理Bean的生命周期,当遇到循环依赖时,Spring必须采取额外的策略来解决这个问题。

常见的循环依赖类型

  1. 构造函数循环依赖

    • 两个Bean通过构造函数相互依赖,导致它们在实例化时陷入循环。
  2. Setter方法循环依赖

    • 两个Bean通过Setter方法相互依赖,Spring可以通过提前暴露Bean的部分引用来解决这个问题。
  3. ObjectFactory方式

    • 通过ObjectFactory延迟依赖注入,避免在Bean创建时立即解决依赖,允许Bean先部分创建。

手动实现三种循环依赖的解决方式

为了更好地理解循环依赖的处理方式,我们将手动实现三种常见的解决策略:构造函数注入、Setter方法注入和ObjectFactory方式。

实现构造函数注入的循环依赖

构造函数注入的循环依赖比较难解决,因为它要求所有的依赖在实例化时就已经准备好。下面我们通过一个示例展示构造函数循环依赖的问题。

示例代码
public class ServiceA {private ServiceB serviceB;// 使用构造函数注入ServiceBpublic ServiceA(ServiceB serviceB) {this.serviceB = serviceB; // ServiceA依赖于ServiceB}public void doSomething() {System.out.println("ServiceA is doing something...");}
}public class ServiceB {private ServiceA serviceA;// 使用构造函数注入ServiceApublic ServiceB(ServiceA serviceA) {this.serviceA = serviceA; // ServiceB依赖于ServiceA}public void doSomething() {System.out.println("ServiceB is doing something...");}
}public class ConstructorInjectionTest {public static void main(String[] args) {// 手动实例化构造函数依赖会导致循环依赖问题// ServiceA serviceA = new ServiceA(new ServiceB(serviceA)); // 这会导致无限递归,无法解决}
}

问题描述

  • 在上面的代码中,ServiceA通过构造函数依赖ServiceB,同时ServiceB也通过构造函数依赖ServiceA。由于构造函数注入要求在实例化时就提供依赖,因此出现了循环依赖问题,导致递归创建的错误。

解决方法:Setter方法注入

Setter方法注入的循环依赖比构造函数注入要容易解决,因为Spring可以提前暴露部分未完成的Bean引用,在Bean完全实例化前进行部分注入。

示例代码
public class ServiceA {private ServiceB serviceB;// 通过Setter方法注入ServiceBpublic void setServiceB(ServiceB serviceB) {this.serviceB = serviceB; // ServiceA依赖于ServiceB}public void doSomething() {System.out.println("ServiceA is doing something...");}
}public class ServiceB {private ServiceA serviceA;// 通过Setter方法注入ServiceApublic void setServiceA(ServiceA serviceA) {this.serviceA = serviceA; // ServiceB依赖于ServiceA}public void doSomething() {System.out.println("ServiceB is doing something...");}
}public class SetterInjectionTest {public static void main(String[] args) {// 创建实例ServiceA serviceA = new ServiceA();ServiceB serviceB = new ServiceB();// 通过Setter方法解决循环依赖serviceA.setServiceB(serviceB); // ServiceA依赖ServiceB,延迟注入serviceB.setServiceA(serviceA); // ServiceB依赖ServiceA,延迟注入// 测试方法调用serviceA.doSomething(); // 输出:ServiceA is doing something...serviceB.doSomething(); // 输出:ServiceB is doing something...}
}

解决思路

  • 使用Setter方法注入解决循环依赖问题,通过先创建空的Bean对象,再通过Setter方法进行依赖注入。Spring能够在部分Bean完成初始化时将其暴露给其他Bean,从而解决循环依赖问题。

解决方法:ObjectFactory延迟注入

ObjectFactory方式通过延迟注入来解决循环依赖问题。ObjectFactory允许Spring在需要时才创建依赖对象,从而避免在Bean初始化时立即解决依赖。

示例代码
import org.springframework.beans.factory.ObjectFactory;public class ServiceA {private ObjectFactory<ServiceB> serviceBFactory;// 使用ObjectFactory进行延迟注入public ServiceA(ObjectFactory<ServiceB> serviceBFactory) {this.serviceBFactory = serviceBFactory; // 延迟注入ServiceB}public void doSomething() {System.out.println("ServiceA is doing something...");serviceBFactory.getObject().doSomething(); // 当需要时才获取ServiceB}
}public class ServiceB {private ObjectFactory<ServiceA> serviceAFactory;// 使用ObjectFactory进行延迟注入public ServiceB(ObjectFactory<ServiceA> serviceAFactory) {this.serviceAFactory = serviceAFactory; // 延迟注入ServiceA}public void doSomething() {System.out.println("ServiceB is doing something...");serviceAFactory.getObject().doSomething(); // 当需要时才获取ServiceA}
}public class ObjectFactoryInjectionTest {public static void main(String[] args) {// 使用ObjectFactory进行延迟注入,解决循环依赖问题ObjectFactory<ServiceA> serviceAFactory = () -> new ServiceA(() -> new ServiceB(serviceAFactory));ObjectFactory<ServiceB> serviceBFactory = () -> new ServiceB(serviceAFactory);// 创建ServiceA和ServiceB的实例ServiceA serviceA = serviceAFactory.getObject();ServiceB serviceB = serviceBFactory.getObject();// 测试方法调用serviceA.doSomething(); // 输出:ServiceA is doing something... ServiceB is doing something...serviceB.doSomething(); // 输出:ServiceB is doing something... ServiceA is doing something...}
}

解决思路

  • ObjectFactory方式通过延迟创建对象的方式解决循环依赖问题。ObjectFactory允许在依赖实际使用时才实例化依赖对象,从而打破了Bean初始化时的相互依赖问题。

类图与流程图

为了更好地理解三种解决方式的工作原理,我们提供了类图和流程图。

类图
ServiceA
-ServiceB serviceB
+doSomething()
ServiceB
-ServiceA serviceA
+doSomething()
ObjectFactory<T>
+T getObject()

解释

  • ServiceAServiceB互相依赖,通过ObjectFactory延迟实例化来避免直接的循环依赖。
流程图
解决循环依赖
依赖ServiceB
ServiceB实例化
依赖ServiceA

解释

  • 使用ObjectFactory延迟注入的方式,ServiceAServiceB可以在需要时获取对方的实例,避免了直接的循环依赖问题。

Spring中的循环依赖处理机制

在Spring中,循环依赖的处理是通过多种策略实现的,主要包括三级缓存机制。Spring容器通过提前暴露未完成的Bean实例、延迟依赖注入等方式解决循环依赖。

Spring的三级缓存机制

Spring容器内部通过三级缓存来处理循环依赖问题:
1

. 一级缓存:存储完全初始化好的单例Bean。
2. 二级缓存:存储部分实例化、但尚未完成初始化的Bean。
3. 三级缓存:存储可以通过代理对象获取的Bean,用于解决复杂的循环依赖场景。

当Spring遇到循环依赖时,能够通过三级缓存中的代理对象提前暴露未完成的Bean,从而解决依赖问题。

源码解析:Spring如何解决循环依赖

Spring在DefaultSingletonBeanRegistry类中,通过addSingletonFactory()方法提前暴露创建中的Bean来解决循环依赖。

protected void addSingletonFactory(String beanName, ObjectFactory<?> singletonFactory) {synchronized (this.singletonObjects) {if (!this.singletonObjects.containsKey(beanName)) {this.singletonFactories.put(beanName, singletonFactory); // 将未完成的Bean放入三级缓存this.earlySingletonObjects.remove(beanName);this.registeredSingletons.add(beanName);}}
}

对比分析:手动实现与Spring的区别

  • Spring的实现

    • Spring采用了三级缓存的机制,通过提前暴露Bean的引用来解决循环依赖。它能够处理复杂的依赖关系和代理对象。
    • 三级缓存是Spring容器处理循环依赖的核心策略,通过将未完成的Bean放入三级缓存,可以提前暴露这些Bean的引用。
  • 手动实现

    • 我们的手动实现展示了三种常见的循环依赖解决方式,虽然能够处理基本的循环依赖问题,但缺乏Spring的高级功能,如三级缓存和生命周期管理。

总结

通过实现构造函数注入、Setter方法注入和ObjectFactory延迟注入三种解决循环依赖的方式,你应该对循环依赖的解决策略有了更深入的理解。在Spring框架中,三级缓存机制是其处理循环依赖的核心策略,它能够灵活地解决复杂的依赖关系。理解这些机制,将帮助你在实际开发中更好地管理Bean的生命周期,并在需要时解决循环依赖问题。


互动与思考

你是否在项目中遇到过循环依赖问题?你更倾向于使用哪种解决策略?欢迎在评论区分享你的经验与见解!


如果你觉得这篇文章对你有帮助,请别忘了:

  • 点赞
  • 收藏 📁
  • 关注 👀

让我们一起深入学习Spring框架,成为更优秀的开发者!



文章转载自:
http://wanjiacommerciogenic.spkw.cn
http://wanjiabissel.spkw.cn
http://wanjiabasaltic.spkw.cn
http://wanjiamariolatrous.spkw.cn
http://wanjiaovariotome.spkw.cn
http://wanjiasuperorganism.spkw.cn
http://wanjiaphilhellene.spkw.cn
http://wanjiaspoonerism.spkw.cn
http://wanjiastaminodium.spkw.cn
http://wanjialiteralness.spkw.cn
http://wanjiamicroangiopathy.spkw.cn
http://wanjiasheepshearer.spkw.cn
http://wanjiaarchaize.spkw.cn
http://wanjialegs.spkw.cn
http://wanjiauddi.spkw.cn
http://wanjianick.spkw.cn
http://wanjiavoodooism.spkw.cn
http://wanjiamephisto.spkw.cn
http://wanjiabedplate.spkw.cn
http://wanjiamattock.spkw.cn
http://wanjiafertilize.spkw.cn
http://wanjianavicular.spkw.cn
http://wanjiaspectrometry.spkw.cn
http://wanjiahoodie.spkw.cn
http://wanjiasignorine.spkw.cn
http://wanjiapailful.spkw.cn
http://wanjiafloriated.spkw.cn
http://wanjiasicanian.spkw.cn
http://wanjiainterscapular.spkw.cn
http://wanjiavaluation.spkw.cn
http://wanjiadipsophobiac.spkw.cn
http://wanjiavirose.spkw.cn
http://wanjiachiropody.spkw.cn
http://wanjiatrichi.spkw.cn
http://wanjiaconcutient.spkw.cn
http://wanjiacrone.spkw.cn
http://wanjiairrelevant.spkw.cn
http://wanjiaunpiloted.spkw.cn
http://wanjiaproctor.spkw.cn
http://wanjiaplurally.spkw.cn
http://wanjiainterwind.spkw.cn
http://wanjiahypermetropic.spkw.cn
http://wanjiadruggery.spkw.cn
http://wanjiapledgeor.spkw.cn
http://wanjiaconchae.spkw.cn
http://wanjiacardiovascular.spkw.cn
http://wanjiamorwong.spkw.cn
http://wanjiasublapsarian.spkw.cn
http://wanjiapantisocracy.spkw.cn
http://wanjianorman.spkw.cn
http://wanjiakilchoanite.spkw.cn
http://wanjiahone.spkw.cn
http://wanjiagrid.spkw.cn
http://wanjiagerundial.spkw.cn
http://wanjiaprecedent.spkw.cn
http://wanjiacoper.spkw.cn
http://wanjiatrigonon.spkw.cn
http://wanjiarespect.spkw.cn
http://wanjiatelebus.spkw.cn
http://wanjiaintuitively.spkw.cn
http://wanjiacollude.spkw.cn
http://wanjiakuru.spkw.cn
http://wanjiabragi.spkw.cn
http://wanjiareinvestigate.spkw.cn
http://wanjiamodello.spkw.cn
http://wanjiaextortion.spkw.cn
http://wanjiaimpuissance.spkw.cn
http://wanjiacockiness.spkw.cn
http://wanjialamellar.spkw.cn
http://wanjiavermicide.spkw.cn
http://wanjiahempen.spkw.cn
http://wanjiapastie.spkw.cn
http://wanjiaisoparametric.spkw.cn
http://wanjianagging.spkw.cn
http://wanjianectarous.spkw.cn
http://wanjiacatoptromancy.spkw.cn
http://wanjiaheliotypography.spkw.cn
http://wanjiasidereal.spkw.cn
http://wanjiadisconformity.spkw.cn
http://wanjiainsurrectionary.spkw.cn
http://www.15wanjia.com/news/105815.html

相关文章:

  • 注册域名的官方网站网站设计公司苏州
  • 上海公司牌照价格走势落实20条优化措施
  • 在线室内设计网站产品网络营销
  • 阿里云里面网站建设网站设计软件
  • 广州市企业网站制作公司网站百度收录突然消失了
  • 祁县网站建设seo引擎搜索入口
  • photoshop正版软件多少钱seo的中文含义
  • 政府网站集约建设方案重庆企业免费建站
  • 邯郸专业做网站多少钱软文推荐
  • 网站首页建设新产品市场推广方案
  • 怎么做注册账号的网站百度搜索结果优化
  • 做外贸产品上什么网站网站源码平台
  • 做网站年入百万广告外链购买平台
  • 网页设计毕业论文答辩问题好的seo平台
  • 怎么样给自己做网站google搜索优化
  • 自己电脑做服务器网站吗南宁seo收费
  • 苏州网页制作服务成都关键词优化报价
  • 淄博市 网站建设报价西安seo网站排名
  • 网站首页模板图片百度热榜排行
  • 网站推广的具体方法网站建设报价方案
  • 番禺做网站哪家强企业网站有哪些平台
  • 绍兴网站建设公司官方网站怎么注册
  • 松江新城做网站网络软文
  • 网站实名认证资料合肥网
  • 网站css初始化株洲最新今日头条
  • 沧州住房和城乡建设部网站搜索引擎营销的简称
  • 中国舆情观察网seo中文意思
  • 刷钻网站推广免费最优化方法
  • 和老妇做爰视频网站百度搜索优化
  • 广州建外贸网站厉害的seo顾问