一文详解Spring是怎么读取配置Xml文件的
Spring读取配置文件Document
在XmlBeanDefinitionReader.doLoadBeanDefinitions(InputSource inputSource, Resource resource)
方法中将Xml文件转换成Document对象; Document doc = doLoadDocument(inputSource, resource);
Element
org.w3c.dom.Element 是一个接口 public interface Element extends Node
Spring中DefaultBeanDefinitionDocumentReader中
在DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(Element root)
中
this.delegate = createDelegate(getReaderContext(), root, parent);
里面调用 BeanDefinitionParserDelegate.initDefaults方法 1.初始化属性值 private final DocumentDefaultsDefinition defaults = new DocumentDefaultsDefinition();
2. TODO...
BeanDefinitionParserDelegate.populateDefaults方法主要是讲xml文件中的一些命名空间的基本配置转换成DocumentDefaultsDefinition 对象; 例如
DocumentDefaultsDefinition
DocumentDefaultsDefinition(文档的默认值定义)保存了 标准的Spring Xml文件中的 {@code beans} 层级的属性,这些属性是当前Xml配置中的默认全局属性值,例如 { @code default-lazy-init },{ @code default-autowire },等等。
例如:
###DefaultsDefinition |
---|
默认定义的标记接口,没有任何定义 ,只是单纯的标记一下;继承BeanMetadataElement类;通常具体的实现(例如DocumentDefaultsDefinition)是基于文档的默认值,例如在一个XML文档根标记级别来进行设置默认值
BeanMetadataElement
需要被实现的元数据接口,这个接口定义了Object getSource()方法,返回一个配置源对象
default-autowire和autowire的可选值:
可选值 | 功能说明 |
---|---|
no | 默认不使用autowiring。 必须显示的使用”“标签明确地指定bean。 |
byName | 根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配。 |
byType | 如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配。如果存在多个该类型的bean,那么将会抛出异常,并指出不能使用byType方式进行自动装配。若没有找到相匹配的bean,则什么事都不发生,属性也不会被设置。如果你不希望这样,那么可以通过设置 dependency-check=”objects”让Spring抛出异常。 |
constructor | 与byType的方式类似,不同之处在于它应用于构造器参数。如果在容器中没有找到与构造器参数类型一致的bean,那么将会抛出异常。 |
autodetect | 通过bean类的自省机制(introspection)来决定是使用constructor还是byType方式进行自动装配。如果发现默认的构造器,那么将使用byType方式。 |
解析完了一些xml中Element的默认属性,接下来就是解析Element中的子属性了 DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(root, this.delegate);
这个方法里我们主要看 delegate.parseCustomElement(ele);
让我们来单独解析一下 NamespaceHandler handler = this.readerContext.getNamespaceHandlerResolver().resolve(namespaceUri)
首先了解一下 this.readerContext
是BeanDefinitionParserDelegate中的一个属性 private final XmlReaderContext readerContext;
##XmlReaderContext
继承了ReaderContext类,并且提供了 对XmlBeanDefinitionReader 和 NamespaceHandlerResolver的访问权限;
1.那XmlReaderContext是什么时候被赋值的呢?我们顺着XmlReaderContext了解一下 ①. XmlBeanDefinitionReader.registerBeanDefinitions中被创建
②.创建后的XmlReaderContext被当做 BeanDefinitionParserDelegate 构造函数的参数来创建BeanDefinitionParserDelegate对象
到此这篇关于一文详解Spring是怎么读取配置Xml文件的的文章就介绍到这了,更多相关Spring Xml文件内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!