spiring系列-看源码AbstractApplicationContext.refresh()->finishBeanFactoryInitialization()
2021/9/7 20:08:17
本文主要是介绍spiring系列-看源码AbstractApplicationContext.refresh()->finishBeanFactoryInitialization(),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
前言:
Spring Bean生命周期:
实例化-new一个对象
注入属性-为实例化中new出来的对象填充属性
初始化-执行aware接口的方法,执行@PostContructor注解的方法,初始化方法,完成AOP代理
销毁
1、finishBeanFactoryInitialization()
源码注解:Instatiate all remaining (non-lazy-init) singletons
实例化所有非懒加载的单例bean
2、调用链路
1)AbstractApplicationContext
1.1)516行 ->refresh()
1.2)550行 ->finishBeanFactoryInitialization()
1.3)878行 ->beanFactory.preInstatiateSingletons()//真正开始实例化入口
上述的beanFactory实际使用的DefaultListableBeanFactory
2)DefaultListableBeanFactory
2.1)846行 ->preInstatiateSingletons()
2.2)860/874/879行 ->getBean()//继承父类AbstractBeanFactory
3)AbstractBeanFactory
3.1)242行 ->doGetBean()// 真正获取bean的方法
3.2)249行 ->getSingleton()//继承父类DefaultSingletonBeanRegistry
如果获一级缓存有直接返回,没有判断二级缓存有直接返回,
没有判断三级缓存有将其放入二级缓存,并清除三级缓存
3.3)321行 ->getSingleton()// 如果249行返回空,执行lamda表达式
createBean()//继承父类AbstractAutowireCapableBeanFactory
4)AbstractAutowireCapableBeanFactory
4.1)517行 ->doCreateBean()// 真正创建bean的方法
4.2)557行 ->createBeanInstance()// 完成bean实例创建
4.3)588行 ->addSingletonFactory()// 将bean对象的工厂放入三级缓存
4.4)594行 ->populateBean()// 注入属性
4.5)595行 ->initializeBean()// 初始化
5)DefaultSingletonBeanRegistry
5.1)228行 ->this.singletonObjects.get()
5.2)248行 ->addSingleton()// 将初始化好的对象加入一级缓存
3、如果有AOP代理
上面4.3步骤有对AOP做处理
1)AbstractAutowireCapableBeanFactory
588行 ->addSingletonFactory()
588行 ->getEarlyBeanRefence()// 获取工厂
961行 ->hasInstantiationAwareBeanPostProcessors// 如果要处理
965行 ->ibp.getEarlyBeanRefence()// 此处如果有AOP,
其对应的Processor为AnnotationAwareAspectJAutoProyCreator
2)AbstractAutoProxyCreator
240行 ->wrapIfNecessary()// 如果需要代理返回代理对象,否则直接返回原对象
4、为什么使用三级缓存
如果只有两级缓存的话,也就是说在对象完成初始化之后注入属性之前就需要完成对象
的代理,这样循环依赖的对象在从二级缓存获取到的对象才会是代理对象。这违背了Spring
设计的AOP代理是在对象初始化的最后阶段才去完成的原则。而使用三级缓存则在只有在
对象需要提前代理的情况下会将代理对象的工厂放入三级缓存(循环依赖),否则三级缓存
里存的是对象的工厂,在初始化的最后一步再进行代理。
这篇关于spiring系列-看源码AbstractApplicationContext.refresh()->finishBeanFactoryInitialization()的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-10Rakuten 乐天积分系统从 Cassandra 到 TiDB 的选型与实战
- 2025-01-09CMS内容管理系统是什么?如何选择适合你的平台?
- 2025-01-08CCPM如何缩短项目周期并降低风险?
- 2025-01-08Omnivore 替代品 Readeck 安装与使用教程
- 2025-01-07Cursor 收费太贵?3分钟教你接入超低价 DeepSeek-V3,代码质量逼近 Claude 3.5
- 2025-01-06PingCAP 连续两年入选 Gartner 云数据库管理系统魔力象限“荣誉提及”
- 2025-01-05Easysearch 可搜索快照功能,看这篇就够了
- 2025-01-04BOT+EPC模式在基础设施项目中的应用与优势
- 2025-01-03用LangChain构建会检索和搜索的智能聊天机器人指南
- 2025-01-03图像文字理解,OCR、大模型还是多模态模型?PalliGema2在QLoRA技术上的微调与应用