位置在abstractApplicationContext.refresh()
SpringBoot启动流程往期博客:
public void refresh() {
......
invokeBeanFactoryPostProcessors(beanFactory);
registerBeanPostProcessors(beanFactory);
......
finishBeanFactoryInitialization(beanFactory);
......
finishRefresh();
}
一、invokeBeanFactoryPostProcessors()
先执行 beanDefinitionRegistryPostProcessor 的 postProcessBeanDefinitionRegistry(),
再执行 beanFactoryPostProcessor 的 postProcessBeanFactory(),
数据来源有 applicationContext.beanFactoryPostProcessors,
以及类型为BeanDefinitionRegistryPostProcessor、BeanFactoryPostProcessor的beanDefinition,
其中有非常重要的beanDefinitionRegistryPostProcessor:ConfigurationClassPostProcessor,在postProcessBeanDefinitionRegistry()中加载自定义bean的beanDefinition,参考博客ConfigurationClassPostProcessor
二、registerBeanPostProcessors()
提前创建beanDefinitionMap中类型为BeanPostProcessor的bean,放到beanFactory的beanPostProcessors集合中。
三、finishBeanFactoryInitialization()
finishBeanFactoryInitialization()中会调用beanFactory 的 preInstantiateSingletons()
public void preInstantiateSingletons() throws BeansException {
......
List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);
for (String beanName : beanNames) {
......
getBean(beanName);
......
}
for (String beanName : beanNames) {
Object singletonInstance = getSingleton(beanName);
if (singletonInstance instanceof SmartInitializingSingleton) {
......
SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;
......
smartSingleton.afterSingletonsInstantiated();
......
}
}
}
getBean()为bean的加载流程,参考博客bean的加载流程
bean加载完后,遍历bean集合,如果实现SmartInitializingSingleton,调用afterSingletonsInstantiated()方法。
四、finishRefresh()
遍历bean集合,如果实现SmartLifecycle,并且isAutoStartup()方法返回值为true,isRunning()方法返回值为false时,调用其start()方法。
1032

被折叠的 条评论
为什么被折叠?



