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(); } } }
未完待续。。。