资讯专栏INFORMATION COLUMN

谈谈spring如何自定义标签

Jokcy / 3022人阅读

摘要:干货点了解如何基于自定义标签,这是自定义组件的第一步。这第一篇,记录基于如何自定义标签。所以,对于想扩展组件的小伙伴来说,了解如何自定义标签和相应的原理是必须走的第一步。到这一步,自定义标签的过程就全部理清楚了。

干货点

了解如何基于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为名注册了一个类ConfigDefinitionParserSchemaNames.CONFIG_ELEMENT对应的变量就是config字符串,目的就是为了解析

显然,ConfigDefinitionParser就是作为解析器存在的。

接下来看看该解析器是什么样的

该解析器继承了AbstractBeanDefinitionParser类,并且重写parseInternal方法,其中的参数element携带了resource:config中的所有配置,我们可以将自身的解析业务放在该函数中。以我自定义的组件为例:

我这边的业务是将SchemaNames.PACKAGE_ELEMENT包下的所有类扫出来并且放入list中保存,已经读取出type、suffix等相关配置。

到这一步,自定义标签的过程就全部理清楚了。
相关源码地址:https://github.com/wiatingpub...

Java源码分析、go语言应用、微服务,更多干货欢迎关注公众号:

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/74693.html

相关文章

  • 70 个 Spring 最常见面试题,Java 晋升必会

    摘要:容器自动完成装载,默认的方式是这部分重点在常用模块的使用以及的底层实现原理。 对于那些想面试高级 Java 岗位的同学来说,除了算法属于比较「天方夜谭」的题目外,剩下针对实际工作的题目就属于真正的本事了,热门技术的细节和难点成为了主要考察的内容。 这里说「天方夜谭」并不是说算法没用,不切实际,而是想说算法平时其实很少用到,甚至面试官都对自己出的算法题一知半解。 这里总结打磨了 70 道...

    Ashin 评论0 收藏0
  • 【Dubbo源码阅读系列】之 Dubbo XML 配置加载

    摘要:在介绍自定义标签解析前,先放一张图帮助大家理解以下是如何从文件中解析并加载的。自定义标签比如的值为根据获取到的,获取对应的对象。关于和加载先后顺序的问题最后再集合一个小例子总结下吧当我们先解析了元素时,我们会遍历所有已经注册注册表中。 今天我们来谈谈 Dubbo XML 配置相关内容。关于这部分内容我打算分为以下几个部分进行介绍: Dubbo XML Spring 自定义 XML 标...

    wangshijun 评论0 收藏0
  • Java项目经验——程序员成长的钥匙

    摘要:当你真正到公司里面从事了几年开发之后,你就会同意我的说法利用找工作,需要的就是项目经验,项目经验就是理解项目开发的基本过程,理解项目的分析方法,理解项目的设计思 Java就是用来做项目的!Java的主要应用领域就是企业级的项目开发!要想从事企业级的项目开发,你必须掌握如下要点: 1、掌握项目开发的基本步骤 2、具备极强的面向对象的分析与设计技巧 3、掌握用例驱动、以架构为核心的主流开发...

    zhangfaliang 评论0 收藏0
  • 谈谈Spring Boot 数据源加载及其多数据源简单实现

    摘要:整个代码如下组装默认配置的数据源,查询数据库配置开始初始化动态数据源数据源完毕初始化动态数据源共计条重新加载数据源配置总结以上源码参考个人项目基于开发基于前后分离的开发平台一起来聊聊你们是咋用的吧。 业务需求 提供所有微服务数据源的图形化维护功能 代码生成可以根据选择的数据源加载表等源信息 数据源管理要支持动态配置,实时生效 附录效果图showImg(https://segment...

    NSFish 评论0 收藏0
  • 谈谈Spring Boot 数据源加载及其多数据源简单实现

    摘要:整个代码如下组装默认配置的数据源,查询数据库配置开始初始化动态数据源数据源完毕初始化动态数据源共计条重新加载数据源配置总结以上源码参考个人项目基于开发基于前后分离的开发平台一起来聊聊你们是咋用的吧。 业务需求 提供所有微服务数据源的图形化维护功能 代码生成可以根据选择的数据源加载表等源信息 数据源管理要支持动态配置,实时生效 附录效果图showImg(https://segment...

    netScorpion 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<