我又来讲源码恶心大家了,嘿嘿~

上一节中讲的 run() 办法启动流程中,有那么一行代码:

refreshContext(context);

这一行代码就是明天的男主角了 - 它实现了bean的加载。它的实现在 AbstractApplicationContext 类的refresh()办法中,上码:

@Overridepublic 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容器启动的外围流程,下一节,重点来了~~