前言 前面的准备工作结束之后,就是进入核心代码 refresh。
源码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 public void refresh () throws BeansException, IllegalStateException { synchronized (this .startupShutdownMonitor) { StartupStep contextRefresh = this .applicationStartup.start("spring.context.refresh" ); prepareRefresh(); ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); prepareBeanFactory(beanFactory); try { postProcessBeanFactory(beanFactory); StartupStep beanPostProcess = this .applicationStartup.start("spring.context.beans.post-process" ); invokeBeanFactoryPostProcessors(beanFactory); registerBeanPostProcessors(beanFactory); beanPostProcess.end(); initMessageSource(); initApplicationEventMulticaster(); onRefresh(); registerListeners(); finishBeanFactoryInitialization(beanFactory); finishRefresh(); } catch (BeansException ex) { if (logger.isWarnEnabled()) { logger.warn("Exception encountered during context initialization - " + "cancelling refresh attempt: " + ex); } destroyBeans(); cancelRefresh(ex); throw ex; } finally { resetCommonCaches(); contextRefresh.end(); } } }
源码就是密密麻麻的一大堆,源码上有相应的注释。
下面就根据流程,一步一步的深入源码,了解到每一步都是做什么了。
容器刷新准备 prepareRefresh
这一步主要是准备一些上下文信息。就不过多介绍了。
obtainFreshBeanFactory
下面关注初始化 BeanFactory 这一步:
进入源码:
通过 Debug 可以看出 refreshBeanFactory()
这一步调用的是 org.springframework.context.support.GenericApplicationContext#refreshBeanFactory
中实现的方法。
继续跟进
发现这块判断了一个 refreshed
刷新状态。
refreshBeanFactory
方法也有另一个实现是在 AbstractRefreshableApplicationContext
中, 只不过我的断点没有断进去,这块也一起看下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 protected final void refreshBeanFactory () throws BeansException { if (hasBeanFactory()) { destroyBeans(); closeBeanFactory(); } try { DefaultListableBeanFactory beanFactory = createBeanFactory(); beanFactory.setSerializationId(getId()); customizeBeanFactory(beanFactory); loadBeanDefinitions(beanFactory); this .beanFactory = beanFactory; } catch (IOException ex) { throw new ApplicationContextException ("I/O error parsing bean definition source for " + getDisplayName(), ex); } }
其中会创建 BeanFactory 并加载 BeanDefinition。只不过我暂时没有断到,所以等后面遇到之后再详细介绍。
总结
本文简单介绍了 refresh 的流程,并介绍了前两个部分:
prepareRefresh 准备上下文信息
obtainFreshBeanFactory 初始化 BeanFactory
相关推荐