spring源码笔记

Bean创建流程

  1. 获取对象的BeanDefinition
  2. 通过反射创建空对象
  3. 填充属性
  4. 调用init方法

 
 

Bean创建关键方法(按顺序)

  1. getBean
  2. doGetBean
  3. createBean
  4. doCreateBean
  5. createBeanInstance
  6. populateBean

 
 

解决循环依赖:三级缓存

循环依赖原因

单例,每个类只有一个对象。A引用B,B又引用A。创建A时,需要把B塞入A中,此时B还没有创建,需要创建B。但B创建又需要A,形成一个死循环。

 
 

创建普通Bean的细节流程

doGetBean -> getSingleton

  1. 从一级缓存singletonObjects拿A,拿不到,需要创建A
  2. 将A放入Set: singletonsCurrentlyInCreation
  3. 实例化A
    • createBean -> doCreateBean (A)
      • doGetBean (B)
  4. 将A从Set: singletonsCurrentlyInCreation中删除
  5. 将A放入一级缓存singletonObjects,同时从二级缓存、三级缓存中删除
  6. 结束

 

doCreateBean

  1. 反射创建A对象
  2. 若A在Set: singletonsCurrentlyInCreation里,则放入三级缓存singletonFactories
  3. populateBean A,填充A属性
    • applyPropertyValues -> resolveValueIfNecessary (此时B是RuntimeBeanReference) -> resolveReference -> beanFactory.getBean -> doGetBean (B)
  4. 依次从一级缓存 -> 二级缓存 尝试拿A,拿到A
  5. 结束

 

关键差异流程

  1. 当B getSingleton(A) 时,从三级缓存里拿A的ObjectFactory(此时A已经在三级缓存里)
  2. 一旦从三级缓存中能拿到值,则立马调用从三级缓存中取出来的ObjectFactory.getObject,并把生成出的半成品放入二级缓存earlySingletonObjects中,最后从三级缓存中删去

 

二级缓存够不够

如果没有aop,二级缓存可以解决循环依赖问题。三级缓存是为了解决代理对象的循环依赖问题。

 
TODO: 代理对象的创建过程?通过debug走

 
 

学习到的代码知识

  1. SetFromMap 用于借助ConcurrentHashMap来实现线程安全的Set
posted @   Numerz  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
历史上的今天:
2021-06-24 RPC中阻塞队列的作用
点击右上角即可分享
微信分享提示