美文网首页
1-2Spring默认标签解析-Spring源码分析

1-2Spring默认标签解析-Spring源码分析

作者: 呆_fe39 | 来源:发表于2020-02-06 13:46 被阅读0次

    看文章之前 首先问自己几个问题

    1.Spring默认标签是如何解析注册的 ?

    Spring中标签分为两种 

         1.Spring默认的标签 如<bean id="account" class

         2.自定义标签  如<aop:aspectj-autoproxy

    对于不同的标签 有不同的处理方式,如下图所示:

    那我们今天主要来学习一下默认标签的解析注册:

    Spring的默认标签 在DefaultBeanDefinitionDocumentReader#parseDefaultElement中解析注册bean 如下图:

    默认解析标签有import,alias,bean,beans,因为我只写了个最简单的domain 所以我们就以标签bean为研究对象展开研究.

    进入processBeanDefinition方法 :

    总结下来:

    1,2 :将元素ele转换封装成BeanDefinitionHolder 

        BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele);解析默认标签

        bdHolder = delegate.decorateBeanDefinitionIfRequired(ele, bdHolder);解析默认标签中的自定义标签属性

     3 :注册bean

                1.BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, registry);

                2.registry.registerBeanDefinition(beanName, definitionHolder.getBeanDefinition()) 

                3.DefaultListableBeanFactory#registerBeanDefinition

     4 :通知事件监听器bean注册成功

    如果大家想进一步了标签解析封装过程 可以进入1,2方法深入了解一下(后面会详细介绍),其实对bean进行注册 自定义标签和默认标签都是一样的 最终都是调用DefaultListableBeanFactory#registerBeanDefinition中的注册方法进行注册 ,所谓的注册bean 就是在DefaultListableBeanFactory 维护的beanDefinitionMap中存bean name 和对应的BeanDefinition的关联关系,注册后通知时间监听器 我注册好了!

    大概流程了解后我们先进入1方法, 了解元素具体解析封装的过程

    BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele);

    我们发现其实这个解析的过程委托给BeanDefinitionParserDelegate#parseBeanDefinitionElement(Element,BeanDefinition)

    1解析除了id,beanName外的其他属性  并封装在GenericBeanDefinition中

    GenericBeanDefinition是BeanDefinition的子类 ,Spring通过BeanDefinition将配置文件的<bean>配置信息转换为容器的内部表示

     2如果没有beanName 就根据spring命名规则为当前bean生成对应的beanName

    进入1

    AbstractBeanDefinition beanDefinition = parseBeanDefinitionElement(ele, beanName, containingBean);可以看到对各种属性的解析,这里就不一个一个分析了 有兴趣的小伙伴可以进入每个方法好好研究哦!

    1.Spring默认标签是如何解析注册的 ?

     答: 默认标签的解析注册 其实是将Element元素解析封装成BeanDefinitionHolder 然后最终通过DefaultListableBeanFactory#registerBeanDefinition方法进行注册 , 所谓的注册其实就是在DefaultListableBeanFactory本地维护的beanDefinitionMap中创建beanName和BeanDefinition的映射关系 当然 DefaultListableBeanFactory本地维护的数据 远不止一个beanDefinitionMap 

    相关文章

      网友评论

          本文标题:1-2Spring默认标签解析-Spring源码分析

          本文链接:https://www.haomeiwen.com/subject/sfjryctx.html