内容简介:了解如何基于spring自定义标签,这是自定义组件的第一步。而最重要的是了解了这个过程后也可以大致了解spring自身部分组件是怎么相互工作和触发的,如spring-aop,组件可以通过反调AopNamespaceHandler了解大致面貌。书写该系列文的初衷是因为最近正在负责一个组件的开发,于是打算将接触和学习到的知识写进博客里。这第一篇,记录基于spring如何自定义标签。自定义标签可以说是spring为了给类似你我这样的开发人员扩展组件使用的,因为它提供了一个标准的公共可插拔的接口;目前我们都知道sp
干货点
了解如何基于spring自定义标签,这是自定义组件的第一步。而最重要的是了解了这个过程后也可以大致了解spring自身部分组件是怎么相互工作和触发的,如spring-aop,组件可以通过反调AopNamespaceHandler了解大致面貌。
系列文描述
书写该系列文的初衷是因为最近正在负责一个组件的开发,于是打算将接触和学习到的知识写进博客里。这第一篇,记录基于spring如何自定义标签。
自定义标签的作用
自定义标签可以说是spring为了给类似你我这样的开发人员扩展组件使用的,因为它提供了一个标准的公共可插拔的接口;目前我们都知道spring非常强大,不过实际上除了spring-core和spring-beans外,其他都是通过自定义标签扩展实现的,其次还有一些开源组件也是,如dubbo等。所以,对于想扩展spring组件的小伙伴来说,了解如何自定义标签和相应的原理是必须走的第一步。
那么如何自定义标签
自定义标签可以简单分为四个步骤,分别是
- 编写.schemas文件,通知spring容器我们定义的xsd文件在哪里;
- 编写.xsd文件,定义配置时可以使用的属性限制或者说支持的那些属性配置;
- 编写.handlers 文件,扩展NamespaceHandler命名空间注册器和定义解析器;
- 在xml文件中使用自定义标签
下面我将以目前开发组件中的代码做例子,从在xml文件中使用开始一步一步逆推,复盘整个自定义标签的过程。
首先,先看下目录情况
common是我自定义的一个组件组,其中包含的resource组件便是这次使用了自定义标签的主体,可以从截图中看出部分相关文件的存放位置。
test-demo是为了测试这次组件中的自定义标签是否有作用而存在,test-demo只是导入了common组件组而已,再从中调用resource组件。好了,目录结构描述完了,接下来进入正题。
看下xml文件如何使用自定义标签
在第4行这里引入了resource对应的命名空间,spring会从本地扫 .handlers ,从中找到对应的Key值和Value值,如
spring容器会将Key值对应的具体命名空间注册注册入容器,至于这个空间注册器是怎么样的,后面再表,继续描述xml文件。
在之后,我们可以在 xmlns:schemaLocation 中找到类似的Key&Value的配置,这次的配置是告诉spring容器从哪里查找XSD文件,这点可以从第六行找到,对应的XSD文件地址是:
http://www.nuofankj.com/resou...
细心的话不难发现,这是一个网络地址,是的,确实如此,不过spring的容器却是先在本地扫.schemas文件,并且读取其中的键值对关系,从中找到本地的文件地址,如果找不到,才会从网络中读取。如 spring.schemas文件:
该文件以一种键值对的形式表明了文件在本地的地址,那就是 resource.xsd ,之后spring容器便会找到 resource.xsd 文件做校验。如
众所周知,XSD文件的作用是定义配置时可以使用的属性限制或者说支持那些属性配置。我们可以直接看applicationContext.xml中的配置
走到这一步就说明配置文件配置好了,接下来便是如何解析的问题了。也就是上文提到 com.nuofankj.resource.schema.NamespaceHandler 。
那么NamespaceHandler类是什么样的
该类扩展自NamespaceHandlerSupport,目的是将组件注册到Spring容器中。其中以 SchemaNames.CONFIG_ELEMENT 为名注册了一个类 ConfigDefinitionParser , SchemaNames.CONFIG_ELEMENT 对应的变量就是 config 字符串,目的就是为了解析
显然, ConfigDefinitionParser 就是作为解析器存在的。
接下来看看该解析器是什么样的
该解析器继承了 AbstractBeanDefinitionParser 类,并且重写 parseInternal 方法,其中的参数element携带了 resource:config 中的所有配置,我们可以将自身的解析业务放在该函数中。以我自定义的组件为例:
我这边的业务是将 SchemaNames.PACKAGE_ELEMENT 包下的所有类扫出来并且放入list中保存,已经读取出type、suffix等相关配置。
到这一步,自定义标签的过程就全部理清楚了。
相关源码地址: https://github.com/wiatingpub...
Java源码分析、 go 语言应用、微服务,更多干货欢迎关注公众号:
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Java学习指南(第4版)(上下册)
Patrick Niemeyer、Daniel Leuck / 李强、王建新、吴戈 / 人民邮电出版社 / 2014-7 / 128.00元
《Java学习指南(第4版)(上、下册)》是畅销Java学习指南的最新版,详细介绍了Java 6和Java 7的语言特性和API。本书全面介绍了Java的基础知识,力图通过完备地介绍Java语言、其类库、编程技术以及术语,从而成为一本名符其实的入门级图书。 《Java学习指南(第4版)(上、下册)》加入了从Java 6和Java 7发布以后的变化,包括新的语言功能、并发工具(Fork-Joi......一起来看看 《Java学习指南(第4版)(上下册)》 这本书的介绍吧!