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

目录

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

前言1

前言2

源码剖析

自定义标签解析

自定义标签的解析步骤

自定义标签的解析步骤

基本标签解析

总结


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

前言1

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

前言2

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

Spring源码之基本标签与自定义标签解析的底层源码分析_第1张图片

由上图可知,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开始测试

Spring源码之基本标签与自定义标签解析的底层源码分析_第2张图片

 4.执行重载的构造器

Spring源码之基本标签与自定义标签解析的底层源码分析_第3张图片

5.

Spring源码之基本标签与自定义标签解析的底层源码分析_第4张图片

6.

Spring源码之基本标签与自定义标签解析的底层源码分析_第5张图片

7.

Spring源码之基本标签与自定义标签解析的底层源码分析_第6张图片

8.

Spring源码之基本标签与自定义标签解析的底层源码分析_第7张图片

9.

Spring源码之基本标签与自定义标签解析的底层源码分析_第8张图片

10.

Spring源码之基本标签与自定义标签解析的底层源码分析_第9张图片11. 核心逻辑方法

Spring源码之基本标签与自定义标签解析的底层源码分析_第10张图片

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

Spring源码之基本标签与自定义标签解析的底层源码分析_第11张图片

Spring源码之基本标签与自定义标签解析的底层源码分析_第12张图片

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

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

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

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

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

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

Spring源码之基本标签与自定义标签解析的底层源码分析_第13张图片

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

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

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

自定义标签解析

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

自定义标签的解析步骤

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

Spring源码之基本标签与自定义标签解析的底层源码分析_第14张图片

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

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

Spring源码之基本标签与自定义标签解析的底层源码分析_第15张图片

2.定义spring.handlers

Spring源码之基本标签与自定义标签解析的底层源码分析_第16张图片

 3.定义spring.handlers文件

Spring源码之基本标签与自定义标签解析的底层源码分析_第17张图片

 4.定义MyNamespaceHandler类

Spring源码之基本标签与自定义标签解析的底层源码分析_第18张图片

5.User类定义

Spring源码之基本标签与自定义标签解析的底层源码分析_第19张图片

 6.定义自定义解析器类

Spring源码之基本标签与自定义标签解析的底层源码分析_第20张图片

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

自定义标签的解析步骤

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

1.

Spring源码之基本标签与自定义标签解析的底层源码分析_第21张图片

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

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

Spring源码之基本标签与自定义标签解析的底层源码分析_第22张图片

Spring源码之基本标签与自定义标签解析的底层源码分析_第23张图片

Spring源码之基本标签与自定义标签解析的底层源码分析_第24张图片

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

Spring源码之基本标签与自定义标签解析的底层源码分析_第25张图片

Spring源码之基本标签与自定义标签解析的底层源码分析_第26张图片

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

基本标签解析

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

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

总结

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

ProcessOn Flowchart

 

你可能感兴趣的:(Spring源码,spring,java,spring,boot)