孙哥Spring源码第三集

第三集 默认标签和自定义标签的解析上

【视频来源于:B站up主孙帅suns Spring源码视频】【微信号:suns45】

3.1 标签解析的认知

所谓容器和工厂无外乎 工厂如何解析XML,分为两大类,一类是默认标签
一类是自定义标签。

3.2 自定义标签的铺垫

1、需要掌握的是 Spring是如何处理默认标签、自定义标签

2、不管是 默认标签 和 自定义标签 Bean都是要把标签封装成对象的

3、BeanDefinition【不止一个,可能还是多个呢】,这么多的 BeanDefinition

4、如何进行存储BeanDefinition

5、对象的创建BeanFactory,直到最后 对象被完成性的创建。

6、完整的对象 创建完了就可以交给用户使用了

3.3 processDefaultElement处理默认标签

孙哥Spring源码第三集_第1张图片

3.3.1 parseBeanDefinitionElement解析

孙哥Spring源码第三集_第2张图片
1、这个方法上从宏观角度上来看返回值是BeanDefinitionHolder,整个BeanDefinitionHolder它实际上就是封装了BeanDefinition还加了beanName以及alias,是为了后续方便使用beanName、alias避免很多层级的调用。

2、parseBeanDefinitionElement把对应bean标签
depend-on
最终把一个bean的完整信息最后都会封装到BeanDefinition进而封装到BeanDefinitionHolder中

3.3.2 decorateBeanDefinitionIfRequired解析

孙哥Spring源码第三集_第3张图片

为了解决bean标签里面含有自定义标签

孙哥Spring源码第三集_第4张图片

3.3.3 registerBeanDefinition

孙哥Spring源码第三集_第5张图片

registerBeanDefinition把解析好的BF进行注册【容器是Map】

3.3.3.1 注册和调用的概念问题

注册是直接调用吗,注册绝不是调用,只是为了存储,一般都是往Map里面存,调用的时候是在某个特定场景下调用,比如说我们注册了很多BeanDefinition,在创建对象的时候它会调用BeanDefinition通过反射把这个类相关的信息以及对象创建出来。

3.3.3.2 在哪做的注册,以及最后存储到了什么位置?

在DefaultListableBeanFactory#registerBeanDefinition做的注册

存储到了DefaultListableBeanFactory的BeanDefinetionMap中

3.3.4 fireComponentRegistered解析

孙哥Spring源码第三集_第6张图片

作用:发送BeanDefinition
注册完成的事件。【BF注册完成后,发一个事件,如果需要扩展,则监听接口,默认空实现】

目的:扩展点---->预留的埋点服务于业务使用。

3.4、处理自定义标签

通过默认标签的学习,这个自定义标签一定会把最后的BeanDefinition存储到beanDefinitionMap和beanDefinitionNames。自定义标签的解析过程在配置文件中配置一个

3.4.1 这个标签最后能变成什么东西呢?是怎么做到呢?

一个标签想要达到对应的功能,都得对应类,

[ .schemas

孙哥Spring源码第三集_第7张图片

在xml文件里面也见到过 .schemas类似的信息
在xml文件中引入
schemaLocation中就会引入这些
孙哥Spring源码第三集_第8张图片

3.4.2 这些自定义的标签 spring又是如何来处理的呢?

handlers就是用来处理特殊的namespace特殊的schema

孙哥Spring源码第三集_第9张图片

在这里会定义那个类来处理:在spring被mvc的resources文件夹下的.handlers的MvcNamepaceHandler来处理的在xml中写了mvc:annotation-driven会被MvcNamepaceHandler这个类来处理MvcNamepaceHandler定义了一个重载的初始化方法,定义了自定义标签的解析器。
不管是默认标签还是自定义标签都会被定义成BeanDefinition

孙哥Spring源码第三集_第10张图片

总结:[ 孙哥Spring源码第三集_第11张图片

3.4.3 springMVC对json的支持

判断有无对应的jar包,如果有jar包,就会使用这个json解析器。

孙哥Spring源码第三集_第12张图片

孙哥Spring源码第三集_第13张图片

3.5 总结自定义注解的流程

  1. schema定义了头和xsd的关系

    孙哥Spring源码第三集_第14张图片

  2. 解析的话就会找handlers,handlers定义了自定义标签用哪些类来解析

孙哥Spring源码第三集_第15张图片

  1. 根据自定义标签找到对应的Parser 解析成BeanDefinition

孙哥Spring源码第三集_第16张图片

  1. 整个的核心是什么?Handler中定义了许多Parser,而Parser将自定义标签
    解析成了 BF。

3.6 我们自定义一个标签

  1. 孙哥Spring源码第三集_第17张图片

  2. 定义一个user.xsd-----------如果我们想要自定义标签就必须定义一个xsd

    2.1、xsd对标签进行约束,表示标签里面可以使用哪些属性

    2.2、
    孙哥Spring源码第三集_第18张图片

    3、创建一个spring.schemas----------------

    3.1、在shemes中
    定义一个逻辑名字的xsd和实际名字的xsd对应上,这就是spring.schemes做的事情。

    3.2、
    孙哥Spring源码第三集_第19张图片{width=“5.7625in” height=“1.6625in”}

    4、在xml里面添加信息----------添加xmlns:suns这里的suns是可以随便定义的,添加schemaLocation=…

    4.1、

    孙哥Spring源码第三集_第20张图片

  3. 创建handler继承NamespaceHandlerSupport,开始解析----------

    5.1、添加user标签和对应的解析类
    孙哥Spring源码第三集_第21张图片孙哥Spring源码第三集_第22张图片

    6、指定解析类

    孙哥Spring源码第三集_第23张图片

    7、测试

    孙哥Spring源码第三集_第24张图片

你可能感兴趣的:(spring,java,后端)