`

基于XML文件读取bean定义:XmlBeanDefinitionReader

阅读更多
基于XML文件读取bean定义
除了基于Properties文件读取bean的定义,这里介绍另一种读取bean的定义方式。这中方式更为常见。
XmlBeanDefinitionReader
主要方法介绍:
loadBeanDefinitions();//加载bean的定义,同样是通过用被指定的编码方式来读取流xml资源文件。同样返回定义的bean的数量
public int loadBeanDefinitions(EncodedResource encodedResource) throws BeanDefinitionStoreException {
		Assert.notNull(encodedResource, "EncodedResource must not be null");
		if (logger.isInfoEnabled()) {
			logger.info("Loading XML bean definitions from " + encodedResource.getResource());
		}

		try {
			InputStream inputStream = encodedResource.getResource().getInputStream();
			try {
				InputSource inputSource = new InputSource(inputStream);
				if (encodedResource.getEncoding() != null) {//如果指定了编码方式,就用指定的编码为流的编码					inputSource.setEncoding(encodedResource.getEncoding());
				}//这类调用该方式真正的做到了加载bean定义
				return doLoadBeanDefinitions(inputSource, encodedResource.getResource());
			}
			finally {//关闭流
				inputStream.close();
			}
		}
		catch (IOException ex) {
			throw new BeanDefinitionStoreException(
					"IOException parsing XML document from " + encodedResource.getResource(), ex);
		}
	}


doLoadBeanDefinitions();该方法真正完成加载bean定义的工作
protected int doLoadBeanDefinitions(InputSource inputSource, Resource resource)
			throws BeanDefinitionStoreException {
		try {//取得xml文件的文档验证方式,比如dtd,xsd。
			int validationMode = getValidationModeForResource(resource);//加载器加载xml文件。
			Document doc = this.documentLoader.loadDocument(
					inputSource, this.entityResolver, this.errorHandler, validationMode, this.namespaceAware);//调用下面介绍的方法注册bean到工厂
			return registerBeanDefinitions(doc, resource);
		}
		catch (BeanDefinitionStoreException ex) {
			throw ex;
		}
		catch (ParserConfigurationException ex) {
			throw new BeanDefinitionStoreException(
					"Parser configuration exception parsing XML from " + resource, ex);
		}
		catch (SAXParseException ex) {
			throw new BeanDefinitionStoreException(
					"Line " + ex.getLineNumber() + " in XML document from " + resource + " is invalid", ex);
		}
		catch (SAXException ex) {
			throw new BeanDefinitionStoreException("XML document from " + resource + " is invalid", ex);
		}
		catch (IOException ex) {
			throw new BeanDefinitionStoreException("IOException parsing XML document from " + resource, ex);
		}
		catch (Throwable ex) {
			throw new BeanDefinitionStoreException("Unexpected exception parsing XML document from " + resource, ex);
		}
	}

registerBeanDefinitions();这里完成注册bean到工厂的工作。
public int registerBeanDefinitions(Document doc, Resource resource) throws BeanDefinitionStoreException {
				if (this.parserClass != null) {//拿到解析器负责从xml解析定义的bean,并负责将它们注册到工厂
			XmlBeanDefinitionParser parser =
					(XmlBeanDefinitionParser) BeanUtils.instantiateClass(this.parserClass);
			return parser.registerBeanDefinitions(this, doc, resource);
		}//若解析器为null,就创建一个documentReader ,把解析bean定义并注册bean到工厂的工作交给它完成
		BeanDefinitionDocumentReader documentReader = createBeanDefinitionDocumentReader();
		int countBefore = getBeanFactory().getBeanDefinitionCount();
		documentReader.registerBeanDefinitions(doc, createReaderContext(resource));
		return getBeanFactory().getBeanDefinitionCount() - countBefore;
	}
分享到:
评论

相关推荐

    java8源码-spring_master:spring源码探究

    java8 源码 容器的基本实现 spring源码剖析,大部分都是基于Spring...XmlBeanFactory对DefaultListableBeanFactory进行了扩展,主要用于从XML文件中读取BeanDefinition,注册及获取Bean都是使用从父类继承的方法

    testSpring

    2013-3-20 22:22:46 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 信息: Loading XML bean definitions from class path resource [beans.xml] 2013-3-20 22:22:49 org....

    spring源代码解析

    //对于XmlWebApplicationContext,当然使用的是XmlBeanDefinitionReader来对bean定义信息来进行解析 XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory); ...

    第14章:网络编程(day20).zip

    [[03 08:58:22,467 INFO ] org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:317) - Loading XML bean definitions from file [/home/tomcats/...

    spring2.5.6源码

    第二句就是整个类中最重要的地方了,顾名思义,它的目的是通过XmlBeanDefinitionReader这个XML的Reader从资源resource中(也就是你的配置文件)读取bean的定义。接下来我们打开XmlBeanDefinitionReader的...

    spring源码解析思维导图

    是Spring注册及加载bean的默认实现,XmlBeanFactory与DefaultListableBeanFactory不同的地方其实是在XmlBeanFactory中使用了自定义的XML读取器XmlBeanDefinitionReader,实现了个性化的BeanDefinitionReader读取。

    spring-circle-reference:用弹簧演示一个奇怪的圆圈参考警告

    一个很奇怪的“循环引用”警告 如果您运行my.Main ,您将看到输出如下: Jan 17, 2015 1:36:28 AM org.spring...Jan 17, 2015 1:36:28 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader lo

    chapter2-DefaultListableBeanFactory结构图.png

    Spring 中最核心的两个类:DefaultListableBeanFactory 与 XmlBeanDefinitionReader spring源码DefaultListableBeanFactory类结构图

    SPRING API 2.0.CHM

    BeanDefinition BeanDefinitionBuilder BeanDefinitionDecorator BeanDefinitionDocumentReader BeanDefinitionHolder BeanDefinitionParser BeanDefinitionParserDelegate BeanDefinitionParsingException ...

Global site tag (gtag.js) - Google Analytics