看文章之前 首先问自己几个问题
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