您的位置:首页 > 移动开发

Spring源码学习--Spring配置解析文件ApplicationContext.xml(一)

2017-06-20 19:09 816 查看
接下来我们用多篇文件对Spring解析Bean配置文件ApplicationContext.xml的过程进行一系列的了解,了解Spring对我们在ApplicationContext.xml中注入的Bean的解析流程。
AbstractApplicationContext:中会初始化Bean容器

@Override
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {

...........

//获取bean容器
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

...........

}

在obtainFreshBeanFactory中会初始化容器并返回初始化后的容器protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
//初始化bean容器
refreshBeanFactory();
ConfigurableListableBeanFactory beanFactory = getBeanFactory();
if (logger.isDebugEnabled()) {
logger.debug("Bean factory for " + getDisplayName() + ": " + beanFactory);
}
return beanFactory;
}AbstractRefreshableApplicationContext类中:在refreshBeanFactory中会初始化容器,并加载配置文件loadBeanDefinitions
@Override
protected final void refreshBeanFactory() throws BeansException {
if (hasBeanFactory()) {
destroyBeans();
closeBeanFactory();
}
try {
//创建Bean容器
DefaultListableBeanFactory beanFactory = createBeanFactory();
beanFactory.setSerializationId(getId());
customizeBeanFactory(beanFactory);
//加载配置文件
loadBeanDefinitions(beanFactory);
synchronized (this.beanFactoryMonitor) {
this.beanFactory = beanFactory;
}
}
catch (IOException ex) {
throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex);
}
}
接下来我们看一下loadBeanDefinitions所做的操作,其实现在AbstractXmlApplicationContext中,简单来说就是初始化了XmlBeanDefinitionReader,XmlBeanDefinitionReader是用来解析ApplicationContext.xml这个文件的。
@Override
protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOException {
// Create a new XmlBeanDefinitionReader for the given BeanFactory.
//创建ApplicationContext.xml文件的处理类XmlBeanDefinitionReader
XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);

// Configure the bean definition reader with this context's
// resource loading environment.
beanDefinitionReader.setEnvironment(this.getEnvironment());
beanDefinitionReader.setResourceLoader(this);
beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this));

// Allow a subclass to provide custom initialization of the reader,
// then proceed with actually loading the bean definitions.
initBeanDefinitionReader(beanDefinitionReader);
//加载ApplicationContext.xml文件
loadBeanDefinitions(beanDefinitionReader);
}
接下来ApplicationContext.xml解析的工作是在XmlBeanDefinitionReader中
protected void loadBeanDefinitions(XmlBeanDefinitionReader reader) throws BeansException, IOException {
Resource[] configResources = getConfigResources();//获取配置文件路径
if (configResources != null) {
reader.loadBeanDefinitions(configResources);
}
String[] configLocations = getConfigLocations();
if (configLocations != null) {
reader.loadBeanDefinitions(configLocations);
}
}

总结:简单来说在ApplicationContext中所做的操作是初始化了一个BeanFactory和XmlBeanDefinitionReader,其中XmlBeanDefinitionReader是用来解析Spring的xml配置文件的,接下来我们会用一篇博客介绍一下XmlBeanDefinitionReader解析Spring的配置文件xml相关的知识。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: