Spring配置文件解析之BeanDefinitionReader详解

 更新时间:2024年02月14日 08:35:49   作者:军伟@  
这篇文章主要介绍了Spring配置文件解析之BeanDefinitionReader详解,ApplicationContext.xml配置文件解析成Document对象,真正对xml中元素解析的类是在BeanDefinitionDocumentReader的实现类中来完成的,需要的朋友可以参考下

BeanDefinitionReader

Spring配置文件的解析是通过BeanDefinitionReader来实现的,其实了解BeanDefinitionReader实现的机制就会发现,其只是将ApplicationContext.xml配置文件解析成Document对象,真正对xml中元素解析的类是在BeanDefinitionDocumentReader的实现类中来完成的,接下来我们也会对它进行介绍。

对ApplicationContext.xml中开始解析的方法是loadBeanDefinitions

AbstractBeanDefinitionReader的loadBeanDefinitions中会对ApplicationContext.xml进行解析

@Override
	public int loadBeanDefinitions(String... locations) throws BeanDefinitionStoreException {
		Assert.notNull(locations, "Location array must not be null");
		int counter = 0;
		for (String location : locations) {
			counter += loadBeanDefinitions(location);
		}
		return counter;
	}
@Override
	public int loadBeanDefinitions(String location) throws BeanDefinitionStoreException {
		return loadBeanDefinitions(location, null);
	}

loadBeanDefinitions中会根据文件地址来进行解析操作:

public int loadBeanDefinitions(String location, Set<Resource> actualResources) throws BeanDefinitionStoreException {
		//判断资源地址类型
		if (resourceLoader instanceof ResourcePatternResolver) {
			// Resource pattern matching available.
			try {
				Resource[] resources = ((ResourcePatternResolver) resourceLoader).getResources(location);
				//在子类的loadBeanDefinitions进行解析操作
				int loadCount = loadBeanDefinitions(resources);
				if (actualResources != null) {
					for (Resource resource : resources) {
						actualResources.add(resource);
					}
				}
				if (logger.isDebugEnabled()) {
					logger.debug("Loaded " + loadCount + " bean definitions from location pattern [" + location + "]");
				}
				return loadCount;
			}
			catch (IOException ex) {
				throw new BeanDefinitionStoreException(
						"Could not resolve bean definition resource pattern [" + location + "]", ex);
			}
		}
		else {
			// Can only load single resources by absolute URL.
			Resource resource = resourceLoader.getResource(location);
			//在子类的loadBeanDefinitions进行解析操作
			int loadCount = loadBeanDefinitions(resource);
			if (actualResources != null) {
				actualResources.add(resource);
			}
			if (logger.isDebugEnabled()) {
				logger.debug("Loaded " + loadCount + " bean definitions from location [" + location + "]");
			}
			return loadCount;
		}
	}

loadBeanDefinitions是在子类XmlBeanDefinitionReader中实现

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

doLoadBeanDefinitions会将文件地址解析为数据流,然后解析数据流

public int loadBeanDefinitions(EncodedResource encodedResource) throws BeanDefinitionStoreException {
		
		..........
		
		try {
			//从xml文件中获取流
			InputStream inputStream = encodedResource.getResource().getInputStream();
			try {
				InputSource inputSource = new InputSource(inputStream);
				if (encodedResource.getEncoding() != null) {
					inputSource.setEncoding(encodedResource.getEncoding());
				}
				//解析文件流
				return doLoadBeanDefinitions(inputSource, encodedResource.getResource());
			}
			finally {
				inputStream.close();
			}
		}
		.......
	}

doLoadBeanDefinitions中会将文件流解析成Document对象

protected int doLoadBeanDefinitions(InputSource inputSource, Resource resource)
			throws BeanDefinitionStoreException {
		try {
			Document doc = doLoadDocument(inputSource, resource);
			return registerBeanDefinitions(doc, resource);
		}
		.....
	}

registerBeanDefinitions中会创建BeanDefinitionDocumentReader来对Document进行解析,对Spring配置文件中的元素进行解析处理。

public int registerBeanDefinitions(Document doc, Resource resource) throws BeanDefinitionStoreException {
		//创建Document解析处理器
		BeanDefinitionDocumentReader documentReader = createBeanDefinitionDocumentReader();
		int countBefore = getRegistry().getBeanDefinitionCount();
		//在BeanDefinitionDocumentReader中解析xml中配置的元素
		documentReader.registerBeanDefinitions(doc, createReaderContext(resource));
		return getRegistry().getBeanDefinitionCount() - countBefore;
	}

总结

简单来说BeanDefinitionReader所做的处理操作是将配置的ApplicationContext.xml解析成为Document对象,接下来会有 BeanDefinitionDocumentReader来对Document进行解析。

到此这篇关于Spring配置文件解析之BeanDefinitionReader详解的文章就介绍到这了,更多相关Spring的BeanDefinitionReader内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java基础之多线程方法状态和创建方法

    Java基础之多线程方法状态和创建方法

    Java中可以通过Thread类和Runnable接口来创建多个线程,下面这篇文章主要给大家介绍了关于Java基础之多线程方法状态和创建方法的相关资料,需要的朋友可以参考下
    2021-09-09
  • spring mvc+localResizeIMG实现HTML5端图片压缩上传

    spring mvc+localResizeIMG实现HTML5端图片压缩上传

    这篇文章主要为大家详细介绍了使用spring mvc+localResizeIMG实现HTML5端图片压缩上传,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • Java 抽象类定义与方法实例详解

    Java 抽象类定义与方法实例详解

    这篇文章主要介绍了java 抽象类与接口的区别介绍的相关资料,需要的朋友可以参考下...
    2017-04-04
  • Dubbo之降级Mock源码分析

    Dubbo之降级Mock源码分析

    这篇文章主要为大家介绍了Dubbo降级Mock源码分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • 详解Java中clone的写法

    详解Java中clone的写法

    这篇文章主要介绍了Java中clone的写法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-07-07
  • Spring事务的七种传播行为

    Spring事务的七种传播行为

    这篇文章主要介绍了Spring事务的七种传播行为,文章围绕主题的相关资料展开详细的内容解说,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-04-04
  • 基于SpringBoot服务端表单数据校验的实现方式

    基于SpringBoot服务端表单数据校验的实现方式

    这篇文章主要介绍了基于SpringBoot服务端表单数据校验的实现方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • Java使用POI实现Excel文件的创建与处理

    Java使用POI实现Excel文件的创建与处理

    这篇文章主要为大家详细介绍了Java如何采用POI原生方式实现自定义Excel表格表头并生成Excel文件,文中的示例代码讲解详细,有需要的小伙伴可以了解下
    2025-05-05
  • Java递归实现JSON全路径自动化探测工具

    Java递归实现JSON全路径自动化探测工具

    在日常开发中,面对嵌套十几层、成百上千行的复杂 JSON,开发者常面临以下困境:路径定位难,AI 幻觉问题,文档缺失等问题,本文分享一个轻量级的 Java 工具类,利用递归算法一键拉平 JSON,输出所有叶子节点的完整路径,需要的朋友可以参考下
    2026-02-02
  • Java commons io包实现多线程同步图片下载入门教程

    Java commons io包实现多线程同步图片下载入门教程

    这篇文章主要介绍了Java commons io包实现多线程同步图片下载入门,commons io: 是针对开发IO流功能的工具类库,其中包含了许多可调用的函数,感兴趣的朋友跟随小编一起看看吧
    2021-04-04

最新评论