看spring源码,spring源码解读,博客整理
Spring源码情操陶冶-ContextLoaderListener
ContextLoaderListener extends ContextLoader implements ServletContextListener
contextInitialized --->initWebApplicationContext();
ApplicationContext体系:
WebApplicationContext initWebApplicationContext(ServletContext servletContext)
initWebApplicationContext方法里面有createWebApplicationContext方法 和configureAndRefreshWebApplicationContext 方法 。
createWebApplicationContext创建一个空的WebApplicationContext(XmlWebApplicationContext),configureAndRefreshWebApplicationContext方法为WebApplicationContext读取相应的配置并且刷新context对象。
configureAndRefreshWebApplicationContext方法包括指定contextConfigLocationSpring配置文件位置、给应用一个id倘若指定了contextId属性、 refresh()方法 ConfigurableWebApplicationContext.refresh()
ConfigurableWebApplicationContext extends WebApplicationContext, ConfigurableApplicationContext
AbstractApplicationContext extends DefaultResourceLoader implements ConfigurableApplicationContext, DisposableBean
ConfigurableApplicationContext 接口有void refresh() throws BeansException, IllegalStateException; 抽象方法。
只有一个实现类实现了方法
所以 ConfigurableWebApplicationContext.refresh() 调用的是 AbstractApplicationContext的refresh()方法。
Spring源码情操陶冶-AbstractApplicationContext
refresh()
refresh里面有这几个方法:
-
AbstractApplicationContext#prepareRefresh
刷新准备工作,@prepareRefresh
-
AbstractApplicationContext#obtainFreshBeanFactory
涉及解析spring配置文件并封装为BeanDefinition对象保存至beanFactory中,@obtainFreshBeanFactory
-
AbstractApplicationContext#prepareBeanFactory
beanFactory的准备工作,设置context的属性配置,@prepareBeanFactory
-
AbstractApplicationContext#postProcessBeanFactory
主要添加ServletContextAwareProcessor处理类,@postProcessBeanFactory
-
AbstractApplicationContext#invokeBeanFactoryPostProcessors
执行BeanDefinitionRegistryPostProcessors/BeanFactoryPostProcessors相关beans,@invokeBeanFactoryPostProcessors
-
AbstractApplicationContext#registerBeanPostProcessors
注册所有实现BeanPostProcessor的接口bean到beanFactory的内部属性beanPostProcessors集合中,@registerBeanPostProcessors
-
AbstractApplicationContext#initMessageSource
初始化资源配置,@initMessageSource
-
AbstractApplicationContext#initApplicationEventMulticaster
初始化ApplictionEventMulticaster广播事件类,@initApplicationEventMulticaster
-
AbstractApplicationContext#onRefresh
初始化themeSource,@onRefresh
-
AbstractApplicationContext#registerListeners
注册ApplicationListener beans到ApplictionEventMulticaster广播集合,@registerListeners
-
AbstractApplicationContext#finishBeanFactoryInitialization
实例化所有的非lazy-init类型的beans,@finishBeanFactoryInitialization
-
AbstractApplicationContext#finishRefresh
完成刷新,并执行ContextRefreshedEvent事件,该事件涉及spring mvc,@finishRefresh
Spring的BeanFactoryPostProcessor和BeanPostProcessor
(finishBeanFactoryInitialization() preInstantiateSingletons()
getBean() doCreateBean() initializeBean())
configureAndRefreshWebApplicationContext方法之后WebApplicationContext对象已经完成
把WebApplicationContext对象赋给servletContext:
servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,this.context);
至此,initWebApplicationContext完成。