首页 / 软件开发 / JAVA / Spring源代码分析-XmlBeanFactory导读
Spring源代码分析-XmlBeanFactory导读2011-03-29 javaeye calmness源代码分析,是一件既痛苦又快乐的事情,看别人写的代码是通过的,但当你能够看 明白的时候,相信快乐也会随之而来,为了减少痛苦,更快的带来快乐,在这里希望通过 这篇文章对觉得困难的朋友有一个帮助。首先来打开该类的代码,我们将看到如下代码:Java代码public class XmlBeanFactory extends DefaultListableBeanFactory {
private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this);
public XmlBeanFactory(Resource resource) throws BeansException {
this(resource, null);
}
public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException {
super(parentBeanFactory);
this.reader.loadBeanDefinitions(resource);
}
}这个类的代码很简单,一个成员对象加两个构造函数,从这里我们可以看出,最重要 的地方在于最后一个构造函数:Java代码super(parentBeanFactory);
this.reader.loadBeanDefinitions(resource);第一句就是将父亲工厂交给父类的构造函数,实际上最后也就是把父工厂保存到类的 parentBeanFactory成员对象中,这个对象是在AbstractBeanFactory抽象类中定义的,而 这个父工厂也会一直传递到该抽象类进行保存。第二句就是整个类中最重要的地方了,顾 名思义,它的目的是通过XmlBeanDefinitionReader这个XML的Reader从资源resource中( 也就是你的配置文件)读取bean的定义。接下来我们打开XmlBeanDefinitionReader的 loadBeanDefinitions方法,我们可看到在这个方法里代码就一行,调用了一个同名不同 参的方法,而参数是EncodedResource的一个实例,这个类实际上是Resource的一个包装 类,用来保存资源的Encode的,那接下来我们再看被调用的loadBeanDefinitions方法, 这个方法里最主要的部分就是:Java代码InputSource inputSource = new InputSource(inputStream);
if (encodedResource.getEncoding() != null) {
inputSource.setEncoding(encodedResource.getEncoding ());
}
return doLoadBeanDefinitions(inputSource, encodedResource.getResource());这里的目的是将资源包装成一个InputSource,连同Resource作为参数传递到 doLoadBeanDefinitions方法Java代码DocumentBuilderFactory factory = createDocumentBuilderFactory();
if (logger.isDebugEnabled()) {
logger.debug("Using JAXP implementation [" + factory + "]");
}
DocumentBuilder builder = createDocumentBuilder(factory);
Document doc = builder.parse(inputSource);
return registerBeanDefinitions(doc, resource);