Spring 源代码解析(二):IoC 容器在 Web 容器中的启动
上面我们分析了 IOC 容器本身的实现,下面我们看看在典型的 web 环境中,
Spring IOC 容器是怎样被载入和起作用的。
简单的说,在 web 容器中,通过 ServletContext 为 Spring 的 IOC 容器提供
宿主环境,对应的建立起一个 IOC 容器的体系。其中,首先需要建立的是根上
下文,这个上下文持有的对象可以有业务对象,数据存取对象,资源,事物管
理器等各种中间层对象。在这个上下文的基础上,和 web MVC 相关还会有一
个上下文来保存控制器之类的 MVC 对象,这样就构成了一个层次化的上下文
结构。在 web 容器中启动 Spring 应用程序就是一个建立这个上下文体系的过
程。Spring 为 web 应用提供了上下文的扩展接口
WebApplicationContext:
Java 代码
1. publicinterfaceWebApplicationContextextendsApplicationCo
ntext{
2. //这里定义的常量用于在 ServletContext 中存取根上下文
3. StringROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE=W
ebApplicationContext.class.getName()+".ROOT";
4. ......
5. //对 WebApplicationContext 来说,需要得到 Web 容器的
ServletContext
6. ServletContextgetServletContext();
7. }
而一般的启动过程,Spring 会使用一个默认的实现,
XmlWebApplicationContext - 这个上下文实现作为在 web 容器中的根上下
文容器被建立起来,具体的建立过程在下面我们会详细分析。
Java 代码
1. publicclassXmlWebApplicationContextextendsAbstractRefre
shableWebApplicationContext{
2.
3. /**这是和 web 部署相关的位置信息,用来作为默认的根上下文
bean 定义信息的存放位置*/
4. publicstatic?nalStringDEFAULT_CONFIG_LOCATION="/
WEB-INF/applicationContext.xml";
5. publicstatic?nalStringDEFAULT_CONFIG_LOCATION_PREFI
X="/WEB-INF/";
6. publicstatic?nalStringDEFAULT_CONFIG_LOCATION_SUFFI
X=".xml";
7.
8. //我们又看到了熟悉的 loadBeanDe?nition,就像我们前面对 IOC 容
器的分析中一样,这个加载工程在容器的 refresh()的时候启动。
9. protectedvoidloadBeanDe?nitions(DefaultListableBeanFact
orybeanFactory)throwsIOException{