基于Spring开发——自定义标签及其解析
? https://blog.csdn.net/zzg1229059735/article/details/82669955
? 在spring中使用过dubbo的人应该都配置过类似
<dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" />
<dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService" />
? 在spring官方文档中42.1点介绍中有详细说明怎么自定义标签,简单的来说自定义标签就是:
? 自定义标签可以说是spring提供的最大、最强的Hook(钩子),通俗的讲就是给后续小伙伴开发组件,提供一个标准公共可拔插”接口”,大家可以理解为手机充电器的工业标准口,为了方便各个充电器生产厂家生产,而制定的标准。
根据需要编写xsd文件。
编写标签对应的实体类。(一个标签对应一个实体类)
编写标签的解析类。(一个标签对应一个解析类)
编写命名空间处理类,(spring的NamespaceHandler)这里我们的是TtdubboNamespaceHandler
编写spring.handlers和spring.schemas串联起所有部件,(spring.handlers和spring.schemas都放在“META-INF”文件夹下)
基本自定义标签需要实现两个关键接口:NamespaceHandlerSupport,BeanDefinitionParser spring.handlers文件作用:具体处理命名空间的handle
key:是你的命名空间,其他xml中通过引入这个命名空间进行使用该元素描述对象
value:指向的是你的handle
spring.schemas文件作用:具体处理命名空间的约束
把具体的约束文件指向本地的META-INF/ttdubbo.xsd,因为好像约束文件默认好像去网上搜索。
实现一个ttdubbo
simpleType,complexType, simpleContent和complexContent标签
<!-- -----------------simpleType ------------------------>
<!-- 定义一个简单类型, 用来规定和约束具有纯文本内容的元素(不含子元素即为具有纯文本内容的元素)或属性的值. -->
<xsd:element name="description" type="xsd:string"/> // 规定一个元素纯文本内容的类型
<xsd:element name="worker">
<xsd:complexType>
<xsd:attribute name="id" type="idType"/>
</xsd:complexType>
</xsd:element>
<xsd:simpleType name="idType">
<xsd:restriction base="xsd:integer"/>
</xsd:simpleType>
<!-- 定义了一个"worker"元素,并规定它具有一个"id"属性,这个属性的类型为"idType", 这是我自定义的一个simpleType,这个simpleType中规定了属性值的类型. -->
<!-- 当然也可以直接将"attribute"的"type"属性设置为"xsd:integer",但我这样写是为了让读者更直观的看出simpleType确实可以规定一个元素属性的数据类型. -->
<!-- -----------------simpleType ------------------------>
<!-- -----------------complexType ------------------------>
<!-- complexType 元素定义复杂类型。复杂类型的元素是包含其他元素和/或属性的 XML 元素。-->
<xsd:element name="student">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="id" type="xsd:int"></xsd:element>
<xsd:element name="name" type="xsd:string"></xsd:element>
<xsd:element name="gender" type="xsd:string"></xsd:element>
<xsd:element name="addr" type="xsd:string"></xsd:element>
</xsd:sequence>
<xsd:attribute name="class" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<!-- 这个complexType为student元素定义了一个复杂类型, 这个类型中包含了四个子元素:id,name,gender,addr,并且使用了sequence指示器指定了这四个子元素的顺序. 还包含了一个class属性.-->
<!-- -----------------complexType ------------------------>
我们经常说的spring容器到底指什么,以及如何存储我们配置bean属性?
基础容器BeanFactory,扩展容器ApplicationContext,他们解析配置文件的过程基本相同。存储结构为Map<beanName, BeanDefinition>实现为ConcurrentHashMap,也就是说我们最终解析出来的xml文件的会存储到这个数据结构中,这就是我们的容器。
我们解析出配置问文件用哪个对象来接收存储?
我们知道在抽象对象世界里everything is object.所以我们将bean抽象成了对象,它的顶层接口就是BeanDefinition,而子类包括了ChildBeanDefinition,RootBeanDefinition ,GenericBeanDefinition,默认文件解析入Map为GenericBeanDefinition.
Spring基础标签有哪些?
Import, alias, bean, beans
Spring配置文件的解析入口在哪?
这里介绍两个重要的接口及其实现类
BeanDefinitionReader
与BeanDefinitionDocumentReader
对应实现类XmlBeanDefinitionReader
、DefaultBeanDefinitionDocumentReader
自定义标签的解析过程
原文:https://www.cnblogs.com/yurenjun/p/13382779.html