拉勾Java高薪训练营之Spring:Bean的加载以及循环依赖处理

一.三级缓存的作用

    在了解Bean的初始化之前,要先了解Bean的三级缓存 以及各自的作用

一级缓存(singletonObjects):单例池 

二级缓存(earlySingletonObjects):早期单例对象  (反射生成的对象 可能属性还没有填充完毕,执行过了Bean的后置处理器 以及aop生成的   二级缓存是为了对象复用)

三级缓存(singletonFactories):单例工厂对象 用于反射生成对象

三级缓存是为了解决循环依赖而产生的(使用三级缓存而不是用二级缓存是因为 一级缓存中单例池为了保证对象的单一性  即是 只存完整的对象 而不是既有完整对象 又有不完整对象):

使用场景:ABean 依赖属性BBean 同样bBean也依赖ABean如下:

解决过程如下:

1,lagouBean实例化 实例化过程中检测有没有依赖ItBean或其他Bean 没有则直接完成所有属性注入放在 单例池中 如果有依赖其他Bean 则放入单例工厂池等待其他依赖Bean注入

2.依赖属性ItBean 实例化,发现itBean含有依赖属性含有依赖属性lagoubean 将itbean放入单例工厂池, 同时从单例工厂池中取出lagoubean完成itBean注入,

3.在上述过程中 获取lagouBean 时候 将反射生成对象放入二级缓存,以备复用 在itBean完成属性注入后 删除单例工厂池中的工厂对象

4.lagouBean完成itBean属性注入 将对象放入单例池 同时删除二级缓存的对象

二. bean的实例化过程

Bean创建⼦流程⼊⼝在AbstractApplicationContext#refresh()⽅法的finishBeanFactoryInitialization(beanFactory) 处

进⼊finishBeanFactoryInitialization

继续进⼊DefaultListableBeanFactory类的preInstantiateSingletons⽅法,我们找到下⾯部分的代码,看到⼯⼚Bean或者普通Bean,最终都是通过getBean的⽅法获取实例

继续跟踪下去,我们进⼊到了AbstractBeanFactory类的doGetBean⽅法,

该方法 尝试从缓存中获取对象 在循环依赖中要用到

如果是第一次创建,则进入createBean方法

接着进⼊到AbstractAutowireCapableBeanFactory类的⽅法,找到以下代码部分



所以这就是构造器注入不能解决循环依赖的原因 

下面是bean的属性填充 以及后置处理器

三  循环依赖源码解析

实例化danlibean过程中会存在循环依赖

进入createBean方法后 可以看到将实力好的对象放入了三级缓存  此时是没有进行属性注入的

然后进入


进入方法最下面的applyPropertyValues方法


可以看到他依赖了ItBean  进入valueResolver.resolveValueIfNecessary方法

进入resolveReference 方法

从工厂中取ItBean

进入后 其实还是doCreateBean方法 在这里初始化bean并放入单例池 供lagouBean后续使用

同样进入getSingleton 方法 过程中执行doCreateBean 在该方法中完成依赖注入  同样执行


然后进行属性的注入获取lagouBean

进入方法后

此时三级缓存中是有值得

也可以看出三级缓存机构

获取到Ilagoubean 并移除三级缓存中数据

二级缓存的数据类型是

实例化完成后进入getSingleton 将itbean放入一级缓存


一级缓存结构

此时完成itbean注册

此时回到lagoubean注册流程

后续操作完成放置到一级缓存中

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,743评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,296评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,285评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,485评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,581评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,821评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,960评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,719评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,186评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,516评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,650评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,936评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,757评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,991评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,370评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,527评论 2 349

推荐阅读更多精彩内容