阿古达芝麻开门 - 博客园

在Springboot项目下面是如何组装Bean的(上)-启动流程概览

createApplicationContext完成后,加载了6个BeanDefinition,此时还没有实例化任何单例,由此可以知道BeanDefinition不是一下子把所有的都加载进来的,适当的时间加载对应的BeanDefinition

图片

 

prepareContext完成之后,把启动类的BeanDefinition也加载进来了,此时还创建了5个singleton的bean,由此可知Bean也不是统一把所有的bean创建出来的,适当的时间创建对应的bean

图片

图片

 

接下来的refreshContext(context)就是重头戏了,因为很多BeanDefinition和Bean创建都会在这里实现,refreshContext最终会调用AbstractApplicationContext#refresh方法:

图片

首先重点关注invokeBeanFactoryPostProcessors(beanFactory),执行完这个步骤后BeanDefinition从7个增加到123个,Singleton bean只是从5个增加到15个:

图片

图片

执行完registerBeanPostProcessors(beanFactory),BeanDefinition的数量没有变化,SingletonBean从15个增加到22个,到这里是不是大概可以判断想要研究BeanDefinition如何加载的,那应该主要关注前面那个步骤呢

图片


onRefresh执行完之后,Singleton bean从22个增加到59个,并且自定义Bean EchoServer也是在这个时候创建的。

图片

 

finishBeanFactoryInitialization(beanFactory);执行完之后,Singleton Bean从59个增加到136个,入口的springbootApplication和自定义Bean EnableEchoServerFlag是在这个时候创建的。疑问:为什么EchoServer和EnableEchoServerFlag会在不同的时间创建呢?难道onRefresh是创建"主Bean",finishBeanFactoryInitialization是创建依赖的Bean? 

图片

 

以上分析可以知道,想要知道BeanDefinition是怎么创建的,应该主要关注invokeBeanFactoryPostProcessors(beanFactory);想要知道怎么实例化Bean的话,应该主要关注onRefreshfinishBeanFactoryInitialization

 

更多请了解一米源码公众号或https://itproject-manager.com/

posted @   阿古达芝麻开门  阅读(146)  评论(0编辑  收藏  举报
编辑推荐:
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
点击右上角即可分享
微信分享提示