先来看个流程图
首先IOC启动是由其运行环境的容器拉起来的,我们来看一个web.xml配置就知道了
记得上面两个高亮处.
1.contextInitialized
首先ContextLoaderListener的contextInitialized函数是最开始的地方,也是应该由运行的容器调用的地方.我们来看下ContextLoaderListener的类的描述说明
这里说的很明白start up 和shut down都是在这里做的.每启动一个contexloaderlistener对象就意味着创建了一个新的web app
2.initWebApplicationContext
这个函数调用是核心调用,主要功能是创建上下文,调用refresh启动IOC.代码截图如下
有4处高亮.首先通过getAttribute方法检测当前的ServerletContext实例是否已经初始化过,如果有则return.
3 createWebApplicationContext
第一次进来this.context这个私有变量一定是NULL的.所以会调用这个函数进行context的初始化, 跟踪代码截图如下
看createWebApplicationContext实现代码一眼就看出来了,首先获取要创建的对象class.然后通过反射创建一个需要的对象.这里的关键就是这个class是怎么获取的.看函数determineContextClass实现.首先是通过传递进来的ServletContext对象,获取其初始化的参数CONTEXT_CLASS_PARAM.其定义如下
public static final String CONTEXT_CLASS_PARAM = “contextClass”;
好了回去看我截的第二图, web.xml的配置.看参数配置
所以这里获取的应该是字符串org.springframework.framework.web.context.XMLWebApplicationContext
然后拿着这个字符串生成class.最终context就是XMLWebApplicationContext的一个对象
4.configureAndRefreshWebApplicationContext
这个函数没什么好说的,最主要就是refresh的调用.XmlWebApplicationContext是AbstractApplicationContext的子类.所以最终调用的AbstractApplicationContext的refresh.这里就是IOC启动的关键地方.大家都知道的
5.后面就是一些收尾的工作了,不用太多注意.只有一点,要调用setAttribute给特定属性设值,免得重复初始化