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的了。

如有不对请提出,共同提高,谢谢!!!

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

时间: 2024-11-10 07:48:34

Spring源码解析——自定义标签解析的相关文章

Spring源码:IOC原理解析(一)

版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! IOC(Inversion of Control),即控制反转,意思是将对象的创建和依赖关系交给第三方容器处理,我们要用的时候告诉容器我们需要什么然后直接去拿就行了.举个例子,我们有一个工厂,它生产各种产品,当你需要某个产品,比如你需要一辆汽车,你就告诉工厂你需要一辆汽车,工厂就会直接返回给你一辆汽车,而不需要你自己通过付出劳动来得到这辆汽车,你也不用关心工厂是如何生产这辆汽车.对应到我们的程序中就是,IOC容器会帮我们创建和管理对象

Spring源码:IOC原理解析(二)

版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 接着上一章节的内容,我们来分析当new一个FileSystemXmlApplicationContext对象的时候,spring到底做了那些事.FileSystemXmlApplicationContext类的内容主要是定义了若干重载的构造方法,核心构造方法如下: /** * Create a new FileSystemXmlApplicationContext with the given parent, * loading th

【spring源码分析】BeanDefinitionRegistryPostProcessor解析

一.自定义BeanDefinitionRegistryPostProcessor BeanDefinitionRegistryPostProcessor继承自BeanFactoryPostProcessor,是一种比较特殊的BeanFactoryPostProcessor.BeanDefinitionRegistryPostProcessor中定义的postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)方法 可以让我们

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

新的一年 只争朝夕 不负韶华 加油加油?? (一)自定义便签使用 步骤:(前提要将Spring Core包加入项目中) (1)创建需要扩展的组件 (2)定义一个XSD文件描述组件内容 (3)创建一个文件,实现BeanDefinitionParse接口,用来解析XSD文件中的定义和组件定义 (4)创建一个Handler文件,扩展自NamespaceHandleSupport,目的是将组件注册到Spring容器 (5)编写Spring.Handlers和Spring.schemas文件 具体代码如下

spring源码剖析(二)Spring默认标签解析及注册实现

在使用spring的时候,我也经常会使用到bean标签,beans标签,import标签,aop标签等. 下面主要为读者介绍spring的默认的自带标签的解析流程. 验证模式(DTD&XSD) dtd基本已被淘汰,现在spring的验证模式基本都是采用xsd文件作为xml文档的验证模式,通过xsd文件可以检查该xml是否符合规范,是否有效.在使用xsd文件对xml文档进行校验的时候,除了要名称空间外(xmlns="http://www.springframework.org/schema

Spring源码深度解析pdf

下载地址:网盘下载 <Spring源码深度解析>从核心实现和企业应用两个方面,由浅入深.由易到难地对Spring源码展开了系统的讲解,包括Spring的设计理念和整体架构.容器的基本实现.默认标签的解析.自定义标签的解析.bean的加载.容器的功能扩展.AOP.数据库连接JDBC.整合MyBatis.事务.SpringMVC.远程服务.Spring消息服务等内容. <Spring源码深度解析>不仅介绍了使用Spring框架开发项目必须掌握的核心概念,还指导读者如何使用Spring框

spring源码-自定义标签-4

一.自定义标签,自定义标签在使用上面相对来说非常常见了,这个也算是spring对于容器的拓展.通过自定义标签的方式可以创造出很多新的配置方式,并且交给容器直接管理,不需要人工太多的关注.这也是spring对于配置拓展的一个很重要的方式. 二.自定义标签的几个步骤:1.创建可扫描的标签和对应的解析类  2.读取页面元素解析 3.加入容器管理 三.涉及到的常用类:BeanDefinitionParser.NamespaceHandlerSupport:文件:spring.handlers.sprin

spring源码阅读(二) Bean加载之自定义标签加载

紧接着上一篇关于spring默认标签加载,这一篇来看下自定义标签的加载 继续从 DefaultBeanDefinitionDocumentReader来看 protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) { if (delegate.isDefaultNamespace(root)) { NodeList nl = root.getChildNodes(); for(

spring源码深度解析— IOC 之 开启 bean 的加载

概述 前面我们已经分析了spring对于xml配置文件的解析,将分析的信息组装成 BeanDefinition,并将其保存注册到相应的 BeanDefinitionRegistry 中.至此,Spring IOC 的初始化工作完成.接下来我们将对bean的加载进行探索. 之前系列文章: spring源码深度解析— IOC 之 容器的基本实现 spring源码深度解析— IOC 之 默认标签解析(上) spring源码深度解析— IOC 之 默认标签解析(下) spring源码深度解析— IOC