我们传入的路径信息已经被ClassPathResource类处理完毕了,接下来就是解析xml,让我们尝试查看一下XmlBeanFactory类
照例,看看官方是怎么描述这个类的
*读取bean定义的{@link DefaultListableBeanFactory}的方便扩展
*从XML文档。委托给下面的{@link XmlBeanDefinitionReader};有效
*相当于对DefaultListableBeanFactory使用XmlBeanDefinitionReader。
*
*<p>所需XML文档的结构、元素和属性名
*在这个类中是硬编码的。(当然,如果需要,可以运行转换
*以生成此格式)beans“不需要是XML的根元素
*document:这个类将解析XML文件中的所有bean定义元素。
*
*<p>此类向{@link DefaultListableBeanFactory}注册每个bean定义
*超类,并依赖后者的{@link BeanFactory}接口的实现。
*它支持单例、原型和对这两种bean的引用。
*请参见{@code“spring-beans-3.x.xsd”}(或历史上的{@code“spring-beans-2.0.dtd”})
*有关选项和配置样式的详细信息。
*
*<p><b>对于高级需求,请考虑使用{@link DefaultListableBeanFactory}和
*{@link XmlBeanDefinitionReader}。</b>后者允许从多个XML中读取
*在实际的XML解析行为中是高度可配置的。
*
*@作者罗德·约翰逊
*@作者Juergen Hoeller
*@作者Chris Beams
*@自2001年4月15日起
*@请参见org.springframework.beans.factory.support.DefaultListableBeanFactory
*@请参阅XmlBeanDefinitionReader
*@从Spring 3.1开始就被弃用,取而代之的是{@link DefaultListableBeanFactory}和
*{@link XmlBeanDefinitionReader}
很显然,官方认为这是一个xml解析的入口类,xml会被委托给其他类解析
接下来我们看构造方法,排除掉包装构造方法后,只有一个构造方法
*使用给定的输入流创建一个新的XmlBeanFactory,
*使用DOM必须是可解析的。
*@param resource要从中加载bean定义的XML资源
*@param parent bean factory父bean工厂
*@throws BeansException以防加载或解析错误
官方的描述已经很清楚了,Resource表示资源,BeanFactory表示类加载工厂
public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException {
super(parentBeanFactory);
this.reader.loadBeanDefinitions(resource);
}
我们跳过空方法,看最终的super方法
最终在AbstractAutowireCapableBeanFactory类中,调用了这两个方法
public AbstractAutowireCapableBeanFactory() {
空方法
super();
将这三个类放入一个hashset集合中,位置在
AbstractAutowireCapableBeanFactory.ignoredDependencyInterfaces
ignoreDependencyInterface(BeanNameAware.class);
ignoreDependencyInterface(BeanFactoryAware.class);
ignoreDependencyInterface(BeanClassLoaderAware.class);
}
public AbstractAutowireCapableBeanFactory(BeanFactory parentBeanFactory) {
上面那个方法
this();
setParentBeanFactory(parentBeanFactory);
}
查看setParentBeanFactory方法
public void setParentBeanFactory(BeanFactory parentBeanFactory) {
查看是否已经存在工厂类,并决定是否报错
if (this.parentBeanFactory != null && this.parentBeanFactory != parentBeanFactory) {
throw new IllegalStateException("Already associated with parent BeanFactory: " + this.parentBeanFactory);
}
若通过了上面的检测,将工厂类赋值给成员变量
this.parentBeanFactory = parentBeanFactory;
}
总的来说,super方法就只是简简单单的把三个类添加到hashset中,并将尝试将工厂类赋值给父类,loadBeanDefinitions属于XmlBeanDefinitionReader类的方法,我们下一篇文章讲