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

网站需要租服务器吗发布项目信息的平台

网站需要租服务器吗,发布项目信息的平台,免费咨询法律平台,基金项目实验室信息网站建设什么是循环依赖 注册一个bean对象的过程: Spring扫描class得到BeanDefinition – 根据得到的BeanDefinition去生成bean – 现根据class推断构造方法 – 根据推断出来的构造方法,反射,得到一个对象 – 填充初始对象中的属性(依赖注入) – 如果…

什么是循环依赖

注册一个bean对象的过程:
Spring扫描class得到BeanDefinition – 根据得到的BeanDefinition去生成bean – 现根据class推断构造方法 – 根据推断出来的构造方法,反射,得到一个对象 – 填充初始对象中的属性(依赖注入) – 如果原始对象种的某个方法被AOP了,那么要根据原始对象生成一个代理对象 – 把最终生成的代理对象放入单例池(singletonObjects,也叫一级缓存)中,下次getBea你就直接从单例池拿

循环依赖就是在依赖注入的时候相互注入,如

public class AService{@Autowiredprivate BService bService;
}
public class BService{@Autowiredprivate AService aService;
}

三级缓存过程

Spring使用了三级缓存的策略来解决循环依赖问题,过程大致如下
创建AService的bean:
AService创建
因为暂时还没有BService,所以创建个BService
BService创建
创建过程中,因为AService已经在三级缓存中出现过,所以会进行以下操作
BService中填充AService
因为BService的属性都已经赋值了,所以BService的初始化就结束了,可以直接放到一级缓存中,完整过程为:
BService实例化过程
此时BService已经实例化完成,那么AService中的依赖就可以进行注入了:
AService实例化第二部分
完整流程图如下:
三级缓存解决循环依赖的完成流程图

简单的源码解析

首先在AbstractAutowireCapabaleBeanFactory类里(我是用ctrl+shift+alt+n找到的)的doCreateBean
先创造了一个bean原始对象,此时还没有依赖注入

		BeanWrapper instanceWrapper = null;if (mbd.isSingleton()) {instanceWrapper = (BeanWrapper)this.factoryBeanInstanceCache.remove(beanName);}if (instanceWrapper == null) {instanceWrapper = this.createBeanInstance(beanName, mbd, args);}Object bean = instanceWrapper.getWrappedInstance();

然后将lambda表达式放入三级缓存中

        if (earlySingletonExposure) {if (this.logger.isTraceEnabled()) {this.logger.trace("Eagerly caching bean '" + beanName + "' to allow for resolving potential circular references");}//放入三级缓存,这个lambda表达式是为了执行aop生成代理对象用的,如果有aop操作,就会拿到代理对象出来this.addSingletonFactory(beanName, () -> {return this.getEarlyBeanReference(beanName, mbd, bean);});}

紧接着就是A的依赖填充

	this.populateBean(beanName, mbd, instanceWrapper);

在这个里面会走到一个getSingleton方法,也就是在缓存中找BService

	//allowEarlyReference是是否允许循环依赖@Nullableprotected Object getSingleton(String beanName, boolean allowEarlyReference) {Object singletonObject = this.singletonObjects.get(beanName);if (singletonObject == null && this.isSingletonCurrentlyInCreation(beanName)) {singletonObject = this.earlySingletonObjects.get(beanName);if (singletonObject == null && allowEarlyReference) {synchronized(this.singletonObjects) {//一级缓存中找singletonObject = this.singletonObjects.get(beanName);if (singletonObject == null) {//二级缓存中找singletonObject = this.earlySingletonObjects.get(beanName);if (singletonObject == null) {//三级缓存中找ObjectFactory<?> singletonFactory = (ObjectFactory)this.singletonFactories.get(beanName);if (singletonFactory != null) {	//找到了//这里相当于上面图文分析中BService在三级缓存中找到AService//直接用lambda表达式注册,然后把他移动到二级缓存中singletonObject = singletonFactory.getObject();this.earlySingletonObjects.put(beanName, singletonObject);this.singletonFactories.remove(beanName);}}}}}}return singletonObject;}

但是显然AService肯定不会找到,然后就会重新走到createBean,创建一个BService,与A一样走到上述的getSingleton,这时会在三级缓存中找到A,然后注入

填充完成之后就会把BService放到一级缓存中,移除三级缓存中的B,然后结束

	exposedObject = this.initializeBean(beanName, exposedObject, mbd);

执行完整个BService的创建,上面的A的依赖填充才会结束,然后A也执行一遍exposedObject = this.initializeBean(beanName, exposedObject, mbd);这行代码,A也结束。

结合图文演示看代码更容易理解捏

http://www.tj-hxxt.cn/news/26590.html

相关文章:

  • 河南省建设厅网站地址网络营销seo优化
  • 自己写的网页怎么发布seo是什么服务
  • 北京给网站做系统的公司seo查询优化
  • 一个主机怎么做两个网站php搭建一个简单的网站
  • 做食品的网站设计要注意百度合伙人官网app
  • 招商网站建设方案下载百度免费版
  • 贵阳网站app制作网站建设制作模板
  • 政府网站制作费用免费搭建网站
  • 厦门网站建设模板世界搜索引擎公司排名
  • 赣州销售网站日本预测比分
  • 阿里云主机怎么做两个网站吗seo优化中以下说法正确的是
  • 哈尔滨做网站建设搜索引擎平台有哪些
  • 网站关键词设置技巧百度竞价排名是以什么形式来计费的广告?
  • 房产网站哪个比较真实营销型制作网站公司
  • 苏州做网站公司排名网站建设优化的技巧
  • 中国正规的加盟网站wix网站制作
  • 美食怎么做的小视频网站网络宣传平台有哪些
  • 在淘宝上做的网站要转出网站seo优化方案设计
  • 做适合漫画网站的图片湖南有实力seo优化
  • 12数据网站建设百度百家号官网登录
  • 网站设计范文国内seo工具
  • 知名做网站深圳新闻今日最新
  • 动态ip怎么建设网站百度指数在线查询小程序
  • 程序员和网站开发百度智能云建站
  • 葡萄牙语独立站建设哪家好十大软件免费下载网站排行榜
  • 搭建网站哪个好什么叫seo优化
  • icp备案网站快速备案专家免费推广引流app
  • 竹子建站加盟咨询网络优化公司排名
  • 精品网站建设多少钱口碑营销成功案例
  • 用axure做高保真旅游网站怎么注册域名网址