`

基于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;
	}
分享到:
评论

相关推荐

    Object-XML文件的相互转换分析

    在Spring中,`BeanUtils`类提供了基本的对象-XML转换功能,而`XmlBeanDefinitionReader`则负责读取XML配置文件并创建bean定义。 XML到Object的转换通常涉及到以下步骤: 1. **解析XML**:使用DOM、SAX或StAX等解析...

    spring中的BeanFactory解析xml文件

    `XmlBeanDefinitionReader`类负责读取XML文件并将其转换为bean定义。 2. **解析XML**:`XmlBeanDefinitionReader`使用DOM解析器(如XOM、JDOM或DOM4J)解析XML文件,生成DOM树。然后,它遍历DOM树,对每个<bean>...

    Spring读取配置文件原理(Spring如何依赖注入的)

    首先,Spring解析XML配置文件的过程是由`BeanDefinitionReader`完成的,它负责读取并解析XML文件,生成BeanDefinition对象。Spring提供了多种类型的BeanDefinitionReader,例如`XmlBeanDefinitionReader`,用于处理...

    自定义spring控制反转(依赖注入)

    自定义实现时,我们需要编写一个解析XML的类,例如`XmlBeanDefinitionReader`,它可以读取XML文件中的bean定义,并将其转换为`BeanDefinition`对象。 **四、解析XML配置** 1. 创建`Resource`对象:`Resource`接口...

    详解Spring简单容器中的Bean基本加载过程

    Deprecated,从 Spring 3.1 开始,但是 Spring 并没有定义出更加高级的基于 XML 加载 bean 的 BeanFactory,而是推荐采用更加原生的方式,即组合使用 DefaultListableBeanFactory 和 XmlBeanDefinitionReader 来完成...

    Spring ioc源码解读

    - **Bean定义读取**:Bean定义的读取过程通过委托给BeanDefinitionReader完成,例如XmlBeanDefinitionReader可以解析XML文件中的Bean定义。 #### 五、总结 通过对Spring IoC容器的理解和源码分析,我们可以深入...

    这一次搞懂Spring的XML解析原理说明

    3. **加载配置元数据**:创建`BeanDefinitionReader`(通常是`XmlBeanDefinitionReader`),读取XML配置文件,将bean定义加载到`BeanDefinitionRegistry`中。`BeanDefinition`包含了bean的完整信息,如类名、属性、...

    spring-analysis

    - **XmlBeanDefinitionReader:** 从XML文件中读取Bean定义。 - **Document Reader:** XML文档读取器。 - **Reader Context:** 读取上下文。 - **Parser Context:** 解析上下文。 - **BeanFactory:** - **...

    Spring解密之XML解析与Bean注册示例详解

    在Spring中,XML解析是通过XmlBeanDefinitionReader来实现的,该类负责读取XML配置文件,并将其转换为BeanDefinition对象。XmlBeanDefinitionReader是Spring资源文件读取、解析、注册的实现,要重点关注该类。 在...

    day38 04-Spring加载配置文件

    工具方面,Spring提供了`BeanDefinitionReader`接口和其实现类,如`XmlBeanDefinitionReader`用于读取XML配置,`ClassPathBeanDefinitionScanner`用于扫描Java配置。此外,Spring Boot引入了自动配置(Auto ...

    Spring XmlBeanFactory 容器的基本实现.doc

    它通过 `DefaultListableBeanFactory` 和 `XmlBeanDefinitionReader` 来加载、解析 XML 配置,将 Bean 定义存储为 `BeanDefinition` 对象,然后根据这些定义创建和管理 Bean 实例。这个过程涉及到资源读取、XML 解析...

    Spring Boot技术知识点:如何读取不同路径里的applicationContext.xml配置文件2

    然而,在某些情况下,可能需要从传统的`applicationContext.xml`配置文件中读取配置,这可能是因为历史遗留项目、集成第三方库或者为了复用已有的XML配置。本篇文章将详细探讨如何在Spring Boot中读取不同路径下的`...

    Spring源代码自我解析

    - **XmlBeanDefinitionReader**是用于从XML配置文件中读取Bean定义的工具类。它负责解析XML文件,并将Bean定义注册到BeanFactory中。 #### 四、IoC容器的创建过程示例 下面通过一个简单的示例来展示如何创建一个...

    Spring源码学习五:BeanDefinition装载1

    XmlBeanDefinitionReader 是一个用于从 XML 文件中读取 BeanDefinition 的读取器。它的 loadBeanDefinitions 方法是核心实现方法。 public int loadBeanDefinitions(EncodedResource encodedResource) throws ...

    spring 源代码解析

    例如,XmlBeanDefinitionReader是专门处理XML格式bean定义的reader,它可以解析XML文件并将其转换为BeanDefinition对象,这些对象存储在IOC容器中,包含了关于bean的所有元数据,如类名、属性、依赖关系等。...

    撸一撸Spring Framework-IoC-BeanDefinition(csdn)————程序.pdf

    在BeanFactory篇中,我们了解到BeanFactory在启动时会从配置元信息(通常是XML文件)中读取BeanDefinition,并将它们注册到BeanDefinitionRegistry中。这个过程是通过一系列的委托和解析机制完成的。 当我们运行...

    spring的基础(一)自己写的ClassPathXmlApplicationContext类

    `ClassPathResource`用于从类路径加载资源,然后`XmlBeanDefinitionReader`读取XML文件并解析Bean定义。 2. **解析XML配置**: - 解析过程涉及到解析Bean的ID、类名、属性、构造函数参数、依赖关系等。Spring使用...

    Spring源码解析.pdf

    - **定义**:`XmlBeanFactory`是基于XML配置文件的`BeanFactory`实现,它能够从XML文件中读取Bean的定义,并构建相应的Bean实例。 - **构造函数**:`XmlBeanFactory(Resource resource)`,其中`Resource`参数表示...

    spring ioc以及事物架构图

    - **XmlBeanDefinitionReader**:用于从XML文档中读取Bean定义信息。 - **BeanDefinitionDocumentReader**:读取XML文档中的Bean定义,并将其解析为BeanDefinition对象。 - **ResourceEntityResolver**:用于解析...

Global site tag (gtag.js) - Google Analytics