目录
Spring源码之基本标签与自定义标签解析的底层源码分析
前言1
前言2
源码剖析
自定义标签解析
自定义标签的解析步骤
自定义标签的解析步骤
基本标签解析
总结
先理清整体脉络,如图所示:ProcessOn Flowchart
使用Ctrl+H进行查看底层工厂BeanFactory接口的关系网,展开到右侧
由上图可知,XmlBeanFactory是最底层的工厂类,因此该工厂类的功能是最强的,测试的时候使用的即是该类对应的工厂对象进行测试,以便窥探整个类图中的所有api调用脉络。
对于debug过程中的主干逻辑的入口方法我都逐一使用红色断点给标记了,其余没有标记的地方都是主干外的分支逻辑,一开始学习,当然是先着手主干逻辑,把主干逻辑理清楚了,那么接着再去看主干的分支逻辑。
1.准备工作
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Product {
private Integer id;
private String name;
private String password;
@Override
public String toString() {
return "Product{" +
"id=" + id +
", name='" + name + '\'' +
", password='" + password + '\'' +
'}';
}
}
2.在applicationContext.xml中进行配置
3.debug开始测试
4.执行重载的构造器
5.
6.
7.
8.
9.
10.
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类进行创建出完整的对象保存在工厂容器中。和基本标签殊途同归!
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