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

2020-02-06  本文已影响0人  呆_fe39

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

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 

上一篇下一篇

猜你喜欢

热点阅读