在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 on 2021-04-05 08:51  itproject-manager  阅读(145)  评论(0编辑  收藏  举报