孙哥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处理默认标签

3.3.1 parseBeanDefinitionElement解析


1、这个方法上从宏观角度上来看返回值是BeanDefinitionHolder,整个BeanDefinitionHolder它实际上就是封装了BeanDefinition还加了beanName以及alias,是为了后续方便使用beanName、alias避免很多层级的调用。

2、parseBeanDefinitionElement把对应bean标签
<bean id=“” class=“” scope=“” abstract=“” parent=“”
depend-on
<property
<constrtor-args
<lookup-method
<replace-method
最终把一个bean的完整信息最后都会封装到BeanDefinition进而封装到BeanDefinitionHolder中

3.3.2 decorateBeanDefinitionIfRequired解析

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

3.3.3 registerBeanDefinition

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

3.3.3.1 注册和调用的概念问题

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

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

在DefaultListableBeanFactory#registerBeanDefinition做的注册

存储到了DefaultListableBeanFactory的BeanDefinetionMap中

3.3.4 fireComponentRegistered解析

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

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

3.4、处理自定义标签

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

3.4.1 <mvc:annotation-driven/>这个标签最后能变成什么东西呢?是怎么做到呢?

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

[<mvc:annotation-driven](mvc:annotation-driven)\在哪里定义的呢?springmvc源码里面的resources文件夹下.handlers
.schemas

在xml文件里面也见到过 .schemas类似的信息
在xml文件中引入 <mvc:annotation-driven/ >
schemaLocation中就会引入这些

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

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

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

总结:[<mvc:annotation-driven](mvc:annotation-driven)\看上去我们只是写了一个标签,其实实际上MVC为我们创建了很多类

3.4.3 springMVC对json的支持

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

3.5 总结自定义注解的流程

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

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

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

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

3.6 我们自定义一个标签

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

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

    2.2、

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

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

    3.2、
    {width=“5.7625in” height=“1.6625in”}

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

    4.1、

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

    5.1、添加user标签和对应的解析类

    6、指定解析类

    7、测试

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值