在我们进行Spring 框架开发中,估计用到最多的就是bean 标签吧,其实在Spring中像<mvc/><context/>这类标签以及在dubbo配置的标签都是属于自定义的标签,标签的解析,已经由作者就行了解析,我们用就好了,那么我们今天就进行开发一个自己的标签,模拟 <mvc:annotation-driven/>
大家都知道
<mvc:annotation-driven/> 这个标签就是将RequestHandlerMapping Adapter .等类进行了加载注册到了spring 容器中,
为了让大家更好的理解,我们看dubbo jar spring webmvc jar 包下的META-INF 目录:
对就是这三个文件,需要我们进行配置:
1.xsd :xml 约束文件,懂XML的就知道,用来约束我们XML 标签规范的,属性等 2.spring.handlers. :用来解析我们XML的处理器,后面我会给大家说,你一定懂 3.spring.schemas :里面是用来标示xsd 的地址的;
我们看dubbo的spring.handlers 文件:忽略前面的地址,主要是后面的class路径,会被Spring反射调用的
http\://code.alibabatech.com/schema/dubbo=com.alibaba.dubbo.config.spring.schema.DubboNamespaceHandler
为什么说,它会被反射调用呢?咋们稳扎稳打,我们看Spring源码--在BeanDefinitionParserDelegate 类中,如果不知道,请看一下我的一篇文章-:
link https://www.cnblogs.com/iscys/p/9756458.html
(1),解析自定义的标签元素,也就是说,自定义的标签都会就进入这个方法:
1.
(2),namespaceUrl 就是这个地址,比如解析到你使用了mvc dubbo 标签了,Spring就会找到这个地址,
(3),通过这个地址,我们其实可以大胆的推测出,这个handler 一定是我们在sprin g.handlers中配置的类的实例化,肯定Spring进行了解析,拿到了
后面的类,是不是呢,我们可以点开handler 获得的方法:
http\://code.alibabatech.com/schema/dubbo=com.alibaba.dubbo.config.spring.schema.DubboNamespaceHandler
点开方法:
1.这个handlerMappings 其实就是 spring.handlers 的一个集合; 2.BeanUtils实例化 3.调用实例化后的init方法
getHandlerMappings 的实现:
(3),我们返回第一步,再执行parse方法,就是我们自己的自定义方法;
------好了,关于Spring 自定义解析其实,Spring 就为我们做了这几件事情
1.实例化一个 自定义handler ,调用init
2.parse 方法调用
OK,我们这么想,Spring为我们的解析将init,方法,parse 方法都写死了,说明Spring 肯定给我们开发者暴露了接口,供我们实现:
1.关于handler的实现:需要
extends NamespaceHandlerSupport 实现 init() 方法;
在init()方法中需要注册我们需要解析的标签内容就像这样;
2.关于new SpringDefinitionParse() 类需要
implements BeanDefinitionParser 实现 其parse 方法,这个是对标签的解析;在Spring中的parse 方法就是间接性的调用这个parse方法;