最近慢慢的系统的回顾一些技术:
储备:
1 IOC容器启动的基本过程
两个过程:
(1) 一个是在web容器建立双亲IOC容器
(2)生成相应的WebApplicationContext并将其初始化
2 Web容器中的上下文设计
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package org.springframework.web.context.support;
import java.io.IOException;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.xml.ResourceEntityResolver;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
public class XmlWebApplicationContext extends AbstractRefreshableWebApplicationContext {
//这里是设置默认BeanDefinition得地方,在/WEB-INF/applicationContext.xml文件中
//默认读取文件得位置
public static final String DEFAULT_CONFIG_LOCATION = "/WEB-INF/applicationContext.xml";
//默认配置文件得位置在/WEB-INF/目录下
public static final String DEFAULT_CONFIG_LOCATION_PREFIX = "/WEB-INF/";
//默认得配置文件后缀名.xml
public static final String DEFAULT_CONFIG_LOCATION_SUFFIX = ".xml";
public XmlWebApplicationContext() {
}
//又看到了熟悉得loadBeanDefinition,就像前面对IOC容器得分析一样,这个加载过程在容器refresh()时启动
protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOException {
//对beanDefinition信息进行解析
XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);
//这里设置ResourceLoader,因为xmlWebApplicationContext是DefaultResource的子类,所以这里同样会使用DefaultResourceLoader来定位BeanDefinition
beanDefinitionReader.setEnvironment(this.getEnvironment());
beanDefinitionReader.setResourceLoader(this);
beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this));
//允许子类为reader配置自定义的初始化过程
this.initBeanDefinitionReader(beanDefinitionReader);
//这里使用定义好的XmlBeanDefinitionReader来载入BeanDefinition
this.loadBeanDefinitions(beanDefinitionReader);
}
protected void initBeanDefinitionReader(XmlBeanDefinitionReader beanDefinitionReader) {
}
//如果有多个BeanDefinition的文件定义,需要逐个载入,都是通过reader来完成的
//这个初始化过程是由refreshBeanFactory方法来完成的,这里只是负责载入BeanDefinition
protected void loadBeanDefinitions(XmlBeanDefinitionReader reader) throws IOException {
String[] configLocations = this.getConfigLocations();
if (configLocations != null) {
String[] var3 = configLocations;
int var4 = configLocations.length;
for(int var5 = 0; var5 < var4; ++var5) {
String configLocation = var3[var5];
reader.loadBeanDefinitions(configLocation);
}
}
}
//获取默认位置/WEB-INF/applicationContext.xml
protected String[] getDefaultConfigLocations() {
return this.getNamespace() != null ? new String[]{"/WEB-INF/" + this.getNamespace() + ".xml"} : new String[]{"/WEB-INF/applicationContext.xml"};
}
}
代码中看到,基本的上下文功能都已经通过类的继承获得,这里需要处理的是,如何获取Bean定义信息,在这里,就转化如何在web容器环境如这里指定的/WEB-INF/applicationContext.xml中获取Bean的信息.然后通过XmlBeanDefinitionReader来载入Bean定义信息的,最终完成整个上下文的初始化.
参考:<<spring技术内幕:深入理解spring架构与设计原理>>