自己看源码总结的不一定准确,记录下来以备以后查看。
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()事件.