Spring源码剖析(二)-Bean对象的三级缓存.pdfVIP

Spring源码剖析(二)-Bean对象的三级缓存.pdf

  1. 1、本文档共2页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Spring源码剖析(⼆)-Bean对象的三级缓存 前⾯讲到Spring在创建Bean的过程中使⽤了三级缓存来对Bean对象进⾏缓存。这个三级缓存是⽤来解决对象的循环依赖问题。 什么是对象的循环依赖? 举个例⼦: class A { private B b; private C c; } class B { private A a; } class C { private A a; } class A中引⽤了B和C,⽽B和C中⼜引⽤了A。 那么在spring中创建Bean对象时,需要先创建对象,然后对其属性进⾏填充。当对A进⾏属性填充时,发现需要创建B和C,⽽在创建B和C时, ⼜发现需要创建A。此时就出现了循环依赖问题了。 怎么解决循环依赖? public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry { /** Cache of singleton objects: bean name to bean instance. */ private final MapString, Object singletonObjects = new ConcurrentHashMap(256); /** Cache of singleton factories: bean name to ObjectFactory. */ private final MapString, ObjectFactory? singletonFactories = new HashMap(16); /** Cache of early singleton objects: bean name to bean instance. */ private final MapString, Object earlySingletonObjects = new HashMap(16); spring利⽤singletonObjects, earlySingletonObjects, singletonFactories三级缓存去解决的。 spring2.png 我们假设现在有这样的场景AService依赖BService,BService依赖AService: 1. AService⾸先实例化,实例化通过ObjectFactory半成品暴露在三级缓存中 2. 填充属性BService,发现BService还未进⾏过加载,就会先去加载BService 3. 再加载BService的过程中,实例化,也通过ObjectFactory半成品暴露在三级缓存 4. 填充属性AService的时候,这时候能够从三级缓存中拿到半成品的ObjectFactory。 protected Object getSingleton(String beanName, boolean allowEarlyReference) { Object singletonObject = this.singletonObjects.get(beanName); if (singletonObject == null isSingletonCurrentlyInCreation(beanName)) { synchronized (this.singletonObjects) { singletonObject = this.earlySingletonObjects.get(beanName); if (singletonObject == null allowEarlyReference) { ObjectFactory? singletonFactory = this.singletonFactories.get(beanName); if (singletonFactory != null) { singletonObject = singletonFactory.getObject();

文档评论(0)

千帆起航 + 关注
实名认证
文档贡献者

走过路过,不要错过!

1亿VIP精品文档

相关文档