读spring源码。最开始的ClassPathXmlApplication上下文用来解析xml的标签,封装成beanDefinition对象。其中自定义标签涉及的spi机制就是本章节的重点探讨的内容。
首先,先看xml解析过程中。拿context自定义标签来举例子,探讨一下spi机制,上源码。
下面这段源码是自定义标签解析的代理类BeanDefinitionParserDelegate

这段代码分3步:
第一步:获取默认的处理类 DefaultNamespaceHandlerResolver,默认读取META-INF/spring.handlers 目录下的文件

第二步:通过URI获取对应的NamespaceHandler处理类。首先是从META-INF/spring.handlers 文件读取到对应的<命名空间,处理类的全路径>的映射关心,通过URI获取处理类实例。

第三步:接下来就是标签解析工作了。
handler.parse(ele, new ParserContext(this.readerContext, this, containingBd));
步骤上面已经理清楚了,我们来细看一下,spi机制具体是如何实现的,主要在第二步实现的。
首先,我们是研究context标签为例进行探讨的,先看一下context下的META-INF/spring.handlers

下面是<命名空间,标签处理类的全限定名>的映射关系,这里面就使用了SPI机制

上面说的处理类的实例化的时候,会调用init()方法。

我们来看一下context处理类的init方法。可以发现,context标签处理类里面注册了很多,标签解析器,并把相应的解析器放入到了一个map中。



OK! 到此context标签的各种属性的解析器全部封装准备好了,现在回到最初的第三部,从标签中获取属性,得到对接的解析器,然后就可以实现属性的功能。

到此讲解完毕!
本文深入解析Spring框架中自定义标签的SPI(Service Provider Interface)机制。通过分析ClassPathXmlApplicationContext的XML解析过程,特别是针对context自定义标签的处理,详细阐述了SPI如何工作。从读取META-INF/spring.handlers文件、获取NamespaceHandler处理类到标签解析的整个流程,揭示了Spring如何利用SPI实现标签解析的灵活性和扩展性。
1086

被折叠的 条评论
为什么被折叠?



