共计 1409 个字符,预计需要花费 4 分钟才能阅读完成。
IOC 的核心就是代码入口就在 AbstractApplictionContext
public void refresh() throws BeansException, IllegalStateException {synchronized (this.startupShutdownMonitor) {
// 在刷新容器前进行一些准备工作,例如设置容器的激活状态,校验容器环境所必须的启动参数
prepareRefresh();
// 刷新内部的 BeanFactory,获得一个新鲜的 BeanFactory,这里面主要是读取 XML 文件,将其转换为 BeanDefinition
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// 对 BeanFactory 进行进一步的完善,包括注册应用上下文感知以及监听器感知的 BeanPostProcessor,// 先注册一些系统的环境 Bean
prepareBeanFactory(beanFactory);
try {
// 给子类在初始化 BeanFactory 重写修改变动 beanFactory 的权利
postProcessBeanFactory(beanFactory);
// 调用 BeanFactoryPostProcessor,可以修改 beanFactory,与上面不同的是,这里是类似插件的形式,耦合度更低
invokeBeanFactoryPostProcessors(beanFactory);
// 提前注册 BeanPostProcessor,用于后期提供代理等功能
registerBeanPostProcessors(beanFactory);
// 初始化消息源,用于国际化
initMessageSource();
// 初始化应用事件广播器,用于广播应用上下文事件
initApplicationEventMulticaster();
// Initialize other special beans in specific context subclasses.
onRefresh();
// 为应用事件广播器初始化监听器 (ApplicationListener)
registerListeners();
// 实例化并注册所有非懒加载的 bean
finishBeanFactoryInitialization(beanFactory);
// 刷新容器后的额外工作,初始化生命周期执行器,发布容器刷新完毕的应用上下文事件
finishRefresh();}
catch (BeansException ex) {if (logger.isWarnEnabled()) {
logger.warn("Exception encountered during context initialization -" +
"cancelling refresh attempt:" + ex);
}
// Destroy already created singletons to avoid dangling resources.
destroyBeans();
// Reset 'active' flag.
cancelRefresh(ex);
// Propagate exception to caller.
throw ex;
}
finally {
// 清除掉不再需要的缓存,节省空间
resetCommonCaches();}
}
}
未完待续。。。
正文完