码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2019-10-13 00:34:52      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:asi   mlu   gui   imei   实体   odex   aop   tis   map   

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

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源码解析——自定义标签解析

标签:asi   mlu   gui   imei   实体   odex   aop   tis   map   

原文地址:https://www.cnblogs.com/shenqiaqia/p/11664471.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!