我又来讲源码恶心大家了,嘿嘿~
上一节中讲的 run() 办法启动流程中,有那么一行代码:
refreshContext(context);
这一行代码就是明天的男主角了 – 它实现了bean的加载。它的实现在 AbstractApplicationContext 类的refresh()办法中,上码:
@Override
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
StartupStep contextRefresh = this.applicationStartup.start("spring.context.refresh");
// 容器状态设置、初始化属性设置、验证必备属性
prepareRefresh();
// 获取beanFactory
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// 设置beanFactory的一些属性、增加后置处理器、注册默认的环境beans、
prepareBeanFactory(beanFactory);
try {
// 空办法,给子类留个钩子注入 postProcessors
postProcessBeanFactory(beanFactory);
StartupStep beanPostProcess = this.applicationStartup.start("spring.context.beans.post-process");
// 执行 BeanFactoryPostProcessor
invokeBeanFactoryPostProcessors(beanFactory);
// BeanPostProcessor注册进容器
registerBeanPostProcessors(beanFactory);
beanPostProcess.end();
// 为容器初始化音讯源
initMessageSource();
// 为容器注册事件播送器
initApplicationEventMulticaster();
// 空办法,留给子类注册其余bean
onRefresh();
// 注册事件监听器,派发之前未解决的事件
registerListeners();
// 初始化剩下的单实例bean
finishBeanFactoryInitialization(beanFactory);
// 初始化什么周期处理器,公布容器启动事件
finishRefresh();
}
…………
finally {
// 清缓存
resetCommonCaches();
contextRefresh.end();
}
}
}
以上是spring容器启动的外围流程,下一节,重点来了~~
发表回复