Spring源码解析——自定义标签解析

Posted 神恰恰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring源码解析——自定义标签解析相关的知识,希望对你有一定的参考价值。

再讲解析自定义标签之前,先要知道怎么实现自定义标签的,接下来就来看下吧。

1.第一步,定义一个实体类,如图1:

图1

2.第二步,定义一个xsd(xsd是什么不知道的自行百度),如图2:
图2

3.第三步,生成spring.handlers和spring.schemas文件,一定要放在resources/META-INF下面,因为解析的时候只会到这个目录下面去找,先看下spring.handlers,如图3:
图3

在看下spring.schemas,如图4:
图4

4.第四步,实现AbstractSingleBeanDefinitionParser类,如图5:
图5

5.第五步,实现NamespaceHandlerSupport类,如图6:
图6

6.第六步,配置applicationCountext.xml,如图7:
图7

在配置自己的标签,如图8:
图8

7.第七步,干就完了,如图9:
图9

至此,自定义的标签就完成了,接下来就来看下,具体解析过程是怎么样的。

 

如图10就是开始解析每个标签的地方,能看到有个parseCustomElement方法,这里就是解析自定义标签的地方
图10

那让我继续往下看吧,parseCustomElement到底干了些啥,如图11:
图11

这里会获取namespace的uri,并且实例化了一个DefaultNamespaceHandlerResolver类,关键还是在resolve方法中,如图12:
图12

这里除了会获取自定义的标签外,还会有已经预先定义好的一些标签如c,p等,这里的getHandlerMapping就是做了这件事情,如图13:
图13

刚前面自定义的时候在resource/META-INF放的文件,现在就读取到了,接下去就是自己实现的NamespaceHandler的init方法了,在来看一眼自定义的init方法,如图14:
图14

有个elementName,和parser,这个信息会放入如雷NamespaceHandlerSupport的private final Map<String, BeanDefinitionParser> parsers = new HashMap();中,最后返回一个自己定义的NamespaceHandler类,那么解析的类也有了,接下去就是解析了,如图15:
图15

这里看一看就知道是注册bean的地方,因为大体其实和解析<bean>是差不多的,先要把所有信息放入AbstractBeanDefinition,然后最后获取到DefaultListableBeanFactory,注册到DefaultListableBeanFactory中,那么先来看parseInternal这个方法,如图16:
图16

通过一个BeanDefinitionBuilder来构造AbstractBeanDefinition,能看到最后有个doParse方法,这个就是自己实现的AbstractSingleBeanDefinitionParser的doParse方法,如图17:
图17

这里的bean.addPropertyValue其实是把这些属性放入到AbstractBeanDefinition的private MutablePropertyValues propertyValues;中,这个初始化了一个ArrayList,这样其实基本上把所有属性都放入了AbstractBeanDefinition中,那接下来AbstractBeanDefinition带着这些信息到DefaultListableBeanFactory中去注册就结束了,如图18:
图18

这里就很眼熟了,因为解析<bean>也会走这里,并把别名放入到SimpleAliasRegistry中,registry.registerBeanDefinition就不往下看了,因为和解析<bean>是一样的,那么到这里自定义标签的解析也解析结束了。
 
下次就应该看是怎么getBean的了。
 
如有不对请提出,共同提高,谢谢!!!

以上是关于Spring源码解析——自定义标签解析的主要内容,如果未能解决你的问题,请参考以下文章

8Spring 源码学习 ~ 自定义标签的解析

Spring 源码分析--自定义标签的解析

Spring源码学习自定义标签的解析

6.2 dubbo在spring中自定义xml标签源码解析

Spring 源码分析--自定义标签的使用

spring源码-自定义标签-4