Spring源码讲解之 XmlBeanDefinitionReader 中 loadBeanDefinitions 方法

XmlBeanDefinitionReader 中 loadBeanDefinitions 方法是在 org.springframework.beans.factory.support.BeanDefinitionReader 接口中被定义的,其作用是从资源文件中加载 bean 定义,该方法接收一个 org.springframework.core.io.Resource 类型的参数,返回值是 int 类型的,从资源文件中成功加载并注册成功的 bean 定义数量,当加载或解析 bean 定义时出现错误会抛出 org.springframework.beans.factory.BeanDefinitionStoreException 异常。

源码

int loadBeanDefinitions(Resource resource) throws BeanDefinitionStoreException;

loadBeanDefinitions 方法在 org.springframework.beans.factory.xml.XmlBeanDefinitionReader 中的实现

public int loadBeanDefinitions(Resource resource) throws BeanDefinitionStoreException {
	return loadBeanDefinitions(new EncodedResource(resource));
}

loadBeanDefinitions(EncodedResource encodedResource) 方法实现

public int loadBeanDefinitions(EncodedResource encodedResource) throws BeanDefinitionStoreException {
	Assert.notNull(encodedResource, "EncodedResource must not be null");
	if (logger.isTraceEnabled()) {
		logger.trace("Loading XML bean definitions from " + encodedResource);
	}

	Set<EncodedResource> currentResources = this.resourcesCurrentlyBeingLoaded.get();

	if (!currentResources.add(encodedResource)) {
		throw new BeanDefinitionStoreException(
				"Detected cyclic loading of " + encodedResource + " - check your import definitions!");
	}

	try (InputStream inputStream = encodedResource.getResource().getInputStream()) {
		InputSource inputSource = new InputSource(inputStream);
		if (encodedResource.getEncoding() != null) {
			inputSource.setEncoding(encodedResource.getEncoding());
		}
		// 重点方法
		// 执行 bean 定义的加载
		return doLoadBeanDefinitions(inputSource, encodedResource.getResource());
	}
	catch (IOException ex) {
		throw new BeanDefinitionStoreException(
				"IOException parsing XML document from " + encodedResource.getResource(), ex);
	}
	finally {
		currentResources.remove(encodedResource);
		if (currentResources.isEmpty()) {
			this.resourcesCurrentlyBeingLoaded.remove();
		}
	}
}

doLoadBeanDefinitions(InputSource inputSource, Resource resource) 方法实现

protected int doLoadBeanDefinitions(InputSource inputSource, Resource resource)
		throws BeanDefinitionStoreException {

	try {
		// 将 XML 文件转换成 Document 对象
		Document doc = doLoadDocument(inputSource, resource);
		// 解析 bean 定义,并注册到 bean 工厂
		int count = registerBeanDefinitions(doc, resource);
		if (logger.isDebugEnabled()) {
			logger.debug("Loaded " + count + " bean definitions from " + resource);
		}
		return count;
	}
	catch (BeanDefinitionStoreException ex) {
		throw ex;
	}
	catch (SAXParseException ex) {
		throw new XmlBeanDefinitionStoreException(resource.getDescription(),
				"Line " + ex.getLineNumber() + " in XML document from " + resource + " is invalid", ex);
	}
	catch (SAXException ex) {
		throw new XmlBeanDefinitionStoreException(resource.getDescription(),
				"XML document from " + resource + " is invalid", ex);
	}
	catch (ParserConfigurationException ex) {
		throw new BeanDefinitionStoreException(resource.getDescription(),
				"Parser configuration exception parsing XML from " + resource, ex);
	}
	catch (IOException ex) {
		throw new BeanDefinitionStoreException(resource.getDescription(),
				"IOException parsing XML document from " + resource, ex);
	}
	catch (Throwable ex) {
		throw new BeanDefinitionStoreException(resource.getDescription(),
				"Unexpected exception parsing XML document from " + resource, ex);
	}
}

doLoadDocument(InputSource inputSource, Resource resource) 方法实现

protected Document doLoadDocument(InputSource inputSource, Resource resource) throws Exception {
	return this.documentLoader.loadDocument(inputSource, getEntityResolver(), this.errorHandler,
			getValidationModeForResource(resource), isNamespaceAware());
}

registerBeanDefinitions(Document doc, Resource resource) 方法实现

public int registerBeanDefinitions(Document doc, Resource resource) throws BeanDefinitionStoreException {
	// 创建一个 BeanDefinitionDocumentReader 实例
	BeanDefinitionDocumentReader documentReader = createBeanDefinitionDocumentReader();
	// 获取 bean 工厂中现有的 bean 定义个数
	int countBefore = getRegistry().getBeanDefinitionCount();
	// 解析资源文件中包含的 bean 定义并注册到 bean 工厂中
	documentReader.registerBeanDefinitions(doc, createReaderContext(resource));
	// 返回本次加载的 bean 定义个数
	return getRegistry().getBeanDefinitionCount() - countBefore;
}

XmlBeanDefinitionReader 中 loadBeanDefinitions 方法讲解完毕,你是否对 Spring 有了新的认识了?

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值