Spring源码组件学习-BeanDefinitionParser
Spring自定义xml配置元素,读取xml配置加载bean的过程
xml扩展大概有以下几个步骤:
- 编写自定义类
- 编写xml schema来描述自定义元素
- 编写
NamespaceHandler实现类编写 - 编写
BeanDefinitionParser实现类 - 把以上组建注册到Spring
xml的schema约束:
schema约束定义了xml文档的结构、内容和语法,包括元素和属性、关系的结构以及数据类型等等。
- 所有的标签和属性都需要Schema来定义(schema本身w3c来定义)。
- 所有的schema文件都需要一个id,即
namespace,其值为一个url,通常是这个xml的xsd文件地址。 namespace值由targetNameSpace属性来指定。- 引入一个
schema约束,使用属性xmls,属性值即为对应schema文件的命名空间nameSpace - 如果引入的
schema非W3c组织定义的,必须指定schema文件的位置,schema文件的位置由schemaLocation来指定。 - 引入多个
schema文件需要使用别名。别名形式如下:xmlns:alias。
对于上述配置文件的详细解读
NamespaceHandler
用于解析自定义命名空间下的所有元素。
Spring提供了默认实现类NamespaceHandlerSupport,只需要重写init()方法注册每个元素的解析器。
注册handler和schema(将组件串联起来)
为了让Spring在解析xml的时候能够感知到自定义的元素,需要将handlers格式和schemas格式的文件放入classPath下的META-INF/目录中。
srping.handlers文件包含了xml schema url和handler类的映射关系,比如:http\://www.windforce.com/common/event=com.windforce.event.config.EvenrNamespaceHandler上面的冒号表示转义,key部分必须和xsd文件的中的
targetNamespace值保持一致。spring.schemas文件包含
xml schema url和xsd文件位置的映射关系。http\://www.windforce.com/common/event/event-1.0.xsd=com/windfore/common/event/config/event-1.0.xsd
BeanDefinitionParser
当解析xml配置文件时遇到在NamespaceHandler中指定的元素,Spring就会将元素交由相应的的BeanDefinitionParser来解析。
BeanDefinitionParser是一个接口,只有一个方法BeanDefinition parse(Element element, ParseContext parseContext),返回BeanDefinition。