spring的加载过程(web) (1)

自己看源码总结的不一定准确,记录下来以备以后查看。

1.通过web.xml配置ContextLoaderListener 或者 ContextLoaderServlet 来加载spring.

2.ContextLoaderListener 或者 ContextLoaderServlet 两个类都是调用createContextLoader()方法

  new一个ContextLoader 实例。

3.ContextLoader 通过一个static方法:

 

static { try { ClassPathResource resource = new ClassPathResource( DEFAULT_STRATEGIES_PATH, ContextLoader.class); defaultStrategies = PropertiesLoaderUtils.loadProperties(resource); } catch (IOException ex) { throw new IllegalStateException( "Could not load 'ContextLoader.properties': " + ex.getMessage()); } }

 

 

 

加载默认的策略,spring不建议用户自己定义策略,策略定义在与ContextLoader同一目录下的ContextLoader.properties。注释(Load default strategy implementations from properties file.This is currently strictly internal and not meant to be customized by application developers.) 

 

4.调用ContextLoader的initWebApplicationContext方法。

1)首先判断ServletContext中是否包含WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE的值这个属性。

2)加载ServletContext的父context,我测试的时候返回的是null.

3)自调用createWebApplicationContext创建根WebApplicationContext。

  <1>首先调用determineContextClass判断使用的是默认的XmlWebApplicationContext或者自定义的一个类。

  <2>实例化contextClass,并强制转化为ConfigurableWebApplicationContext接口

  <3>设置父context,设置servletContext,设置配置文件的位置。

  <4>调用refresh(ConfigurableApplicationContext接口中定义,AbstractApplicationContext类中实现)。

4)把context设置到 ServletContext中。属性名:WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE
初始化完毕,其中红色部分进行了配置文件的加载.研究中。。。。

//===================================补充说明红色标记部分====================================

#加载配置文件
1.prepareRefresh 准备context进行refresh。准备refresh context,设置他的启动时间和使用状态.

2.obtainFreshBeanFactory 得到刷新后的BeanFactory.

 1)首先会调用refreshBeanFactory(真正的加载方法),由子类提供。

   AbstractApplicationContext有两个直接子类一个AbstractRefreshableApplicationContext,一个GenericApplicationContext 前者AbstractRefreshableApplicationContext.refreshBeanFactory()(此方法不可以重载)初始化BeanFacotry,后者不支持多次刷新是通过DefaultListableBeanFactory.registerBeanDefinition()注册。
 2)调用getBeanFactory()返回ConfigurableListableBeanFactory类型的BeanFactory

 3)refreshBeanFactory方法暂时没研究

 

3.bean的生命周期开始.

    1)prepareBeanFactory(beanFactory);在context中准备BeanFactory使用

    2)postProcessBeanFactory(beanFactory);登记BeanPostProcessor
    3)invokeBeanFactoryPostProcessors(beanFactory);调用作为bean在context注册的factory processors
    4)registerBeanPostProcessors(beanFactory);注册拦截bean创建的BeanProcessors
    5)initMessageSource();为本context初始化消息源
    6)initApplicationEventMulticaster(); 为context初始化事件的多点传送
    7)onRefresh(); 默认是空实现

    8)registerListeners();检测监听器bean并且注册他们

    9)beanFactory.preInstantiateSingletons();实例化单例允许他们存储信息资源
  10)publishEvent(new ContextRefreshedEvent(this));

       最后一步:公布对应的事件.实例化一个ContextRefreshedEvent()事件.

你可能感兴趣的:(spring,xml,Web,bean)