标签:时间 base and sp1 contex 了解 ica res proc
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的话,应该主要关注onRefresh和finishBeanFactoryInitialization
更多请了解一米源码公众号或https://itproject-manager.com/
在Springboot项目下面是如何组装Bean的(上)-启动流程概览
标签:时间 base and sp1 contex 了解 ica res proc
原文地址:https://www.cnblogs.com/jovic/p/14617769.html