spring源码分析(二)XmlBeanFactory类

我们传入的路径信息已经被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

*@自2001415日起

*@请参见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类的方法,我们下一篇文章讲

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值