Spring源码之基本标签与自定义标签解析的底层源码分析
创始人
2025-05-30 19:54:50
0

目录

Spring源码之基本标签与自定义标签解析的底层源码分析

前言1

前言2

源码剖析

自定义标签解析

自定义标签的解析步骤

自定义标签的解析步骤

基本标签解析

总结


Spring源码之基本标签与自定义标签解析的底层源码分析

前言1

先理清整体脉络,如图所示:ProcessOn Flowchart

前言2

使用Ctrl+H进行查看底层工厂BeanFactory接口的关系网,展开到右侧

由上图可知,XmlBeanFactory是最底层的工厂类,因此该工厂类的功能是最强的,测试的时候使用的即是该类对应的工厂对象进行测试,以便窥探整个类图中的所有api调用脉络。

源码剖析

对于debug过程中的主干逻辑的入口方法我都逐一使用红色断点给标记了,其余没有标记的地方都是主干外的分支逻辑,一开始学习,当然是先着手主干逻辑,把主干逻辑理清楚了,那么接着再去看主干的分支逻辑。

1.准备工作

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Product {private Integer id;private String name;private String password;@Overridepublic String toString() {return "Product{" +"id=" + id +", name='" + name + '\'' +", password='" + password + '\'' +'}';}}

2.在applicationContext.xml中进行配置

    

3.debug开始测试

 4.执行重载的构造器

5.

6.

7.

8.

9.

10.

11. 核心逻辑方法

11.1如果是基本标签解析,我们追入parseDefaultElement方法

上图第一个断点对应方法:

当parseBeanDefinition方法执行完后,会创建出BeanDefinitionHolder对象,把标签属性数据进行封装给BeanDefinition对象,并且把BeanDefinition对象进行封装到BeanDefinitionHolder对象对应的属性上面去,便于之后通过BeanDefinitionHolder进行获取BeanDefinition对象。

上图第三个断点对应方法:

当registerBeanDefinition方法执行完后,会把封装解析出的BeanDefinition对象使用DefaultListableBeanFactory进行完成注册创建对象!底层使用Map进行保存,键值为:beanName,Value值为:BeanDefinition对象。

追就追到这里吧,这里展开太多了。

11.2 如果是自定义标签解析,那么就追入parseCustomElement方法

对该方法,有一个疑惑,BeanDefinition由谁封装????????我们知道,只有封装出BeanDefinition对象后,最终才可以结合多个标签对应的BeanDefinition对象进行创建出对应的完整对象。

BeanDefinition如何进行创建的?具体创建方式下述见"自定义标签解析"

通过自定义标签底层自定义解析后,会创建到对应的BeanDefinition对象,最终才可以结合多个标签对应的BeanDefinition对象通过DefaultListableBeanFactory对象进行创建出对应的完整对象。

自定义标签解析

首先自己定义一个自定义标签来解释一下,后面再列举标签进行解释。

自定义标签的解析步骤

首先会在applicationContext.xml这个工厂配置文件中识别到自定义的标签:

applicationContext.xml文件对应的自定义标签是如何调用生效的呢?依赖下面这些步骤完成的操作作为基石

1.定义user.xsd文件,该文件其实就是一个约束文件

2.定义spring.handlers

 3.定义spring.handlers文件

 4.定义MyNamespaceHandler类

5.User类定义

 6.定义自定义解析器类

7.最终底层封装为BeanDefinition对象类型,最后存储BeanDefinition,最终通过DefaultListableBeanFactory类进行创建出完整的对象保存在工厂容器中。和基本标签殊途同归!

自定义标签的解析步骤

该标签虽然也是自定义标签,但是mvc内置的自定义标签,所以无需自己进行构建xsd文件,自定义解析器等等,我们从applicationContext.xml文件中开始进行解析。分析步骤如下:

1.

2.如上图所示:xsi:schemaLocation 对应mvc的地址为两个,如上图标识所示。

3.http://www.springframework.org/schema/mvc对应到spring.handlers文件

 4.http://www.springframework.org/schema/mvc/spring-mvc.xsd

通过自定义标签底层自定义解析后,会创建到对应的BeanDefinition对象,最终才可以结合多个标签对应的BeanDefinition对象通过DefaultListableBeanFactory对象进行创建出对应的完整对象。

基本标签解析

对于基本标签解析,已经在"源码分析"中解析足够透彻,就是通过parseDefaultElement方法进行一系列解析,最终创建出对应的BeanDefinition对象。

它与自定义标签不同,基本标签没有对应的自定义解析器类,也没有xsd文件,也没有schemas文件等等。

总结

做一张图总结整个流程即可:

ProcessOn Flowchart

 

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【Ctfer训练计划】——(三... 作者名:Demo不是emo  主页面链接:主页传送门 创作初心ÿ...