第三集 默认标签和自定义标签的解析上
【视频来源于: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 总结自定义注解的流程
-
schema定义了头和xsd的关系
-
解析的话就会找handlers,handlers定义了自定义标签用哪些类来解析
- 根据自定义标签找到对应的Parser 解析成BeanDefinition
- 整个的核心是什么?Handler中定义了许多Parser,而Parser将自定义标签
解析成了 BF。
3.6 我们自定义一个标签
-
-
定义一个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、
-
创建handler继承NamespaceHandlerSupport,开始解析----------
5.1、添加user标签和对应的解析类
6、指定解析类
7、测试