以下引用自博客:http://jiwenke-spring.blogspot.com/
上面我们分析了IOC容器本身的实现,下面我们看看在典型的web环境中,Spring IOC 容器是怎样被载入和起作用的。
简单的说,在web容器中,通过ServletContext为Spring的IOC容器提供宿主环境,对 应的建立起一个IOC容器的体系。其中,首先需要建立的是根上下文,这个上下文持有的 对象可以有业务对象,数据存取对象,资源,事物管理器等各种中间层对象。在这个上下 文的基础上,和web MVC相关还会有一个上下文来保存控制器之类的MVC对象,这样就构成 了一个层次化的上下文结构。在web容器中启动Spring应用程序就是一个建立这个上下文 体系的过程。Spring为web应用提供了上下文的扩展接口
WebApplicationContext:
代码
public interface WebApplicationContext extends ApplicationContext {
//这里定义的常量用于在ServletContext中存取根上下文
String ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE = WebApplicationContext.class.getName() + ".ROOT";
......
//对WebApplicationContext来说,需要得到Web容器的ServletContext
ServletContext getServletContext();
}
而一般的启动过程,Spring会使用一个默认的实现,XmlWebApplicationContext - 这 个上下文实现作为在web容器中的根上下文容器被建立起来,具体的建立过程在下面我们 会详细分析。
代码
public class XmlWebApplicationContext extends AbstractRefreshableWebApplicationContext {
/** 这是和web部署相关的位置信息,用来作为默认的根上下文bean定义信息的存 放位置*/
public static final String DEFAULT_CONFIG_LOCATION = "/WEB- INF/applicationContext.xml";
public static final String DEFAULT_CONFIG_LOCATION_PREFIX = "/WEB- INF/";
public static final String DEFAULT_CONFIG_LOCATION_SUFFIX = ".xml";
//我们又看到了熟悉的loadBeanDefinition,就像我们前面对IOC容器的分析中一 样,这个加载工程在容器的refresh()的时候启动。
protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws IOException {
//对于XmlWebApplicationContext,当然使用的是XmlBeanDefinitionReader 来对bean定义信息来进行解析
XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);
beanDefinitionReader.setResourceLoader(this);
beanDefinitionReader.setEntityResolver(new ResourceEntityResolver (this));
initBeanDefinitionReader(beanDefinitionReader);
loadBeanDefinitions(beanDefinitionReader);
}
protected void initBeanDefinitionReader(XmlBeanDefinitionReader beanDefinitionReader) {
}
//使用XmlBeanDefinitionReader来读入bean定义信息
protected void loadBeanDefinitions(XmlBeanDefinitionReader reader) throws BeansException, IOException {
String[] configLocations = getConfigLocations();
if (configLocations != null) {
for (int i = 0; i < configLocations.length; i++) {
reader.loadBeanDefinitions(configLocations[i]);
}
}
}
//这里取得bean定义信息位置,默认的地方是/WEB- INF/applicationContext.xml
protected String[] getDefaultConfigLocations() {
if (getNamespace() != null) {
return new String[] {DEFAULT_CONFIG_LOCATION_PREFIX + getNamespace() + DEFAULT_CONFIG_LOCATION_SUFFIX};
}
else {
return new String[] {DEFAULT_CONFIG_LOCATION};
}
}
}