看spring源码,spring源码解读,博客整理

来源:互联网 发布:cr2什么软件打开 编辑:程序博客网 时间:2024/06/06 02:45

Spring源码情操陶冶-ContextLoaderListener 

 ContextLoaderListener extends ContextLoader implements ServletContextListener

contextInitialized --->initWebApplicationContext();


ApplicationContext体系:



Spring源码情操陶冶-ContextLoader   

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完成。


原创粉丝点击