基于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;
}
分享到:
相关推荐
在Spring中,`BeanUtils`类提供了基本的对象-XML转换功能,而`XmlBeanDefinitionReader`则负责读取XML配置文件并创建bean定义。 XML到Object的转换通常涉及到以下步骤: 1. **解析XML**:使用DOM、SAX或StAX等解析...
`XmlBeanDefinitionReader`类负责读取XML文件并将其转换为bean定义。 2. **解析XML**:`XmlBeanDefinitionReader`使用DOM解析器(如XOM、JDOM或DOM4J)解析XML文件,生成DOM树。然后,它遍历DOM树,对每个<bean>...
首先,Spring解析XML配置文件的过程是由`BeanDefinitionReader`完成的,它负责读取并解析XML文件,生成BeanDefinition对象。Spring提供了多种类型的BeanDefinitionReader,例如`XmlBeanDefinitionReader`,用于处理...
自定义实现时,我们需要编写一个解析XML的类,例如`XmlBeanDefinitionReader`,它可以读取XML文件中的bean定义,并将其转换为`BeanDefinition`对象。 **四、解析XML配置** 1. 创建`Resource`对象:`Resource`接口...
Deprecated,从 Spring 3.1 开始,但是 Spring 并没有定义出更加高级的基于 XML 加载 bean 的 BeanFactory,而是推荐采用更加原生的方式,即组合使用 DefaultListableBeanFactory 和 XmlBeanDefinitionReader 来完成...
- **Bean定义读取**:Bean定义的读取过程通过委托给BeanDefinitionReader完成,例如XmlBeanDefinitionReader可以解析XML文件中的Bean定义。 #### 五、总结 通过对Spring IoC容器的理解和源码分析,我们可以深入...
3. **加载配置元数据**:创建`BeanDefinitionReader`(通常是`XmlBeanDefinitionReader`),读取XML配置文件,将bean定义加载到`BeanDefinitionRegistry`中。`BeanDefinition`包含了bean的完整信息,如类名、属性、...
- **XmlBeanDefinitionReader:** 从XML文件中读取Bean定义。 - **Document Reader:** XML文档读取器。 - **Reader Context:** 读取上下文。 - **Parser Context:** 解析上下文。 - **BeanFactory:** - **...
在Spring中,XML解析是通过XmlBeanDefinitionReader来实现的,该类负责读取XML配置文件,并将其转换为BeanDefinition对象。XmlBeanDefinitionReader是Spring资源文件读取、解析、注册的实现,要重点关注该类。 在...
工具方面,Spring提供了`BeanDefinitionReader`接口和其实现类,如`XmlBeanDefinitionReader`用于读取XML配置,`ClassPathBeanDefinitionScanner`用于扫描Java配置。此外,Spring Boot引入了自动配置(Auto ...
它通过 `DefaultListableBeanFactory` 和 `XmlBeanDefinitionReader` 来加载、解析 XML 配置,将 Bean 定义存储为 `BeanDefinition` 对象,然后根据这些定义创建和管理 Bean 实例。这个过程涉及到资源读取、XML 解析...
然而,在某些情况下,可能需要从传统的`applicationContext.xml`配置文件中读取配置,这可能是因为历史遗留项目、集成第三方库或者为了复用已有的XML配置。本篇文章将详细探讨如何在Spring Boot中读取不同路径下的`...
- **XmlBeanDefinitionReader**是用于从XML配置文件中读取Bean定义的工具类。它负责解析XML文件,并将Bean定义注册到BeanFactory中。 #### 四、IoC容器的创建过程示例 下面通过一个简单的示例来展示如何创建一个...
XmlBeanDefinitionReader 是一个用于从 XML 文件中读取 BeanDefinition 的读取器。它的 loadBeanDefinitions 方法是核心实现方法。 public int loadBeanDefinitions(EncodedResource encodedResource) throws ...
例如,XmlBeanDefinitionReader是专门处理XML格式bean定义的reader,它可以解析XML文件并将其转换为BeanDefinition对象,这些对象存储在IOC容器中,包含了关于bean的所有元数据,如类名、属性、依赖关系等。...
在BeanFactory篇中,我们了解到BeanFactory在启动时会从配置元信息(通常是XML文件)中读取BeanDefinition,并将它们注册到BeanDefinitionRegistry中。这个过程是通过一系列的委托和解析机制完成的。 当我们运行...
`ClassPathResource`用于从类路径加载资源,然后`XmlBeanDefinitionReader`读取XML文件并解析Bean定义。 2. **解析XML配置**: - 解析过程涉及到解析Bean的ID、类名、属性、构造函数参数、依赖关系等。Spring使用...
- **定义**:`XmlBeanFactory`是基于XML配置文件的`BeanFactory`实现,它能够从XML文件中读取Bean的定义,并构建相应的Bean实例。 - **构造函数**:`XmlBeanFactory(Resource resource)`,其中`Resource`参数表示...
- **XmlBeanDefinitionReader**:用于从XML文档中读取Bean定义信息。 - **BeanDefinitionDocumentReader**:读取XML文档中的Bean定义,并将其解析为BeanDefinition对象。 - **ResourceEntityResolver**:用于解析...