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

绵阳企业网站建设公司品牌建设金点子

绵阳企业网站建设公司,品牌建设金点子,使用模板建站,霍山做网站什么是循环依赖 注册一个bean对象的过程#xff1a; Spring扫描class得到BeanDefinition – 根据得到的BeanDefinition去生成bean – 现根据class推断构造方法 – 根据推断出来的构造方法#xff0c;反射#xff0c;得到一个对象 – 填充初始对象中的属性(依赖注入) – 如果…什么是循环依赖 注册一个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 因为暂时还没有BService所以创建个BService 创建过程中因为AService已经在三级缓存中出现过所以会进行以下操作 因为BService的属性都已经赋值了所以BService的初始化就结束了可以直接放到一级缓存中完整过程为 此时BService已经实例化完成那么AService中的依赖就可以进行注入了 完整流程图如下 简单的源码解析 首先在AbstractAutowireCapabaleBeanFactory类里(我是用ctrlshiftaltn找到的)的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.dnsts.com.cn/news/217313.html

相关文章:

  • 台州高端网站设计中国高端网站建设
  • 用旧电脑做服务器建网站用关键词排名网站
  • 购物网站的策划解决网站兼容性问题
  • 手机端网站开发工具网站公司 北京
  • 零售户电商网站订货网址南宁旅游网站建设
  • 大型网站建设设备html5手机网站实例
  • 公司做网站的原因音乐网站首页设计
  • 网站后台初始密码定边网站建设
  • 博客网站模板西安seo报价
  • 资阳建网站苏州网页设计费用
  • 黑客做的网站好用不营销型网站的缺点
  • 建设网站的模板海外网站导航
  • 郑州 服装网站建设如何修改wordpress登入地址
  • 腾虎广州网站建设wordpress增加分页功能
  • 万年县建设银行网站拼音全称网站建设网站建设 网站制作
  • 网站怎么做关键字用php制作一个个人信息网站
  • 百度网站优化 件青海网页设计与网站建设
  • 网站做推广如何设计二维码百度搜索网站提交
  • 服务器发布网站旅行网站的建设目录
  • 商店网站制作WordPress D8 5.1
  • 无限动力网站海拉尔网站设计
  • 全国广告公司网站建设广告设计要学哪些软件
  • 焦作做网站长宁做网站价格
  • 购买网站空间的方法10个网站
  • 美橙互联网站建设案例网络公司排名
  • discuz 企业网站 模板微博营销
  • 宁乡住房和城乡建设局网站网站主机名
  • 青岛网站建设机构用科讯cms做网站的步骤
  • 网站的程序怎么做的免费ai智能写作一键生成
  • vps如何做网站365网站建设