再讲解析自定义标签之前,先要知道怎么实现自定义标签的,接下来就来看下吧。
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的了。
如有不对请提出,共同提高,谢谢!!!
原文地址:https://www.cnblogs.com/shenqiaqia/p/11664471.html