spring默认标签解析
来源:互联网 发布:美国对外投资数据 编辑:程序博客网 时间:2024/06/07 00:28
上篇说到对Document的解析,其中的方法并没有深究,那么spring究竟是如何解析Document默认标签的呢?
bean标签的解析
此方法是spring解析默认标签的实现,里面有好几种bean的解析,我们来看最复杂的processBeanDefinition(),这就是对我们日常所用bean的解析。
可以看到,在此方法中,依次对bean进行了解析,并将结果放在BeanDefinitionHolder中,如果解析结果中子标签有自定义属性,还需要继续进行解析,将最终解析结果进行注册,最后通知相关事件,bean的加载已经完成了。下面来看看具体解析bean的实现。
这个方法中,可以看到,先是对id和name属性进行了解析,然后进入parseBeanDefinitionElement()方法进行进一步的解析,如果不存在beanName时,通过spring中的规则为bean生成对应的beanName,最后将获取到的信息封装到BeanDefinitionHolder中返回。下边我们来看看parseBeanDefinitionElement中对bean的进一步解析。
我们可以很清晰的看到,这个方法里面对各种标签进行了解析,将解析结果封装在AbstractBeanDefinition中,并返回。这里我们就知道了,在spring的xml文件中有各种标签,如class,name等,而在AbstractBeanDefinition以及它的继承类中,则有各个对应的属性用于存储解析出来的标签值。解析完成后,将tBeanDefinition注册到BeanDefinitionRegistry中,BeanDefinitionRegistry就像一个内存数据库,以map的形式保存bean的信息,后续操作直接从BeanDefinitionRegistry中读取配置信息就可以了。思路就是这样子,实现就不看了,是对每个标签的解析,然后将解析的值填进BeanDefinition中,最后返回,将返回值再进行包装,放到BeanDefinitionHolder中,再返回。
bean标签的注册
bean解析完成之后,就是注册了。
这里看到,可以使用beanName和别名进行注册,而且所有的别名都会进行注册。
下面具体一一来看,先看通过beanName进行注册
可以看到,先对BeanDefinition进行最后一次校验,主要是检验methodOverrides,校验通过后,先检查是否有之前同样name的BeanDefinition存在,若有,判断是否允许覆盖,若不允许,则直接抛出异常。下边两步则对覆盖的情况进行了日志打印,主要就是打印oldBeanDefinition已被覆盖,且覆盖的所使用的role不同。
然后将bean进行记录,清除对应的缓存。
再来看看通过别名注册bean
可以看到,如果alias和name相同,则不记录,删除alias;如果不允许覆盖,则抛出异常;检查是否存在循环引用的那种情况,若有,则抛出异常;所有的检查都通过后,注册alias。
通知监听器及注册完成
最后通过此行代码完成监听器逻辑,spring暂时没有实现此逻辑。
到此,spring xml文件的解析到bean的注册已经差不多了,好多的地方没有说到,能力有限,多多指正!
0 0
- spring默认标签解析
- Spring源码解析-默认标签的解析
- Spring笔记03-Spring解析默认标签
- Spring默认标签解析及注册实现
- spring源码深度解析(笔记二)--默认标签的解析
- Spring源码解析之默认标签的解析(一)
- Spring学习(3)——默认标签的解析
- 《Spring源码深度解析》阅读笔记5-默认标签的解析之bean标签的解析及注册
- Spring源码解析之一 ------ 默认标签的解析注册(IOC的第一步)
- 《Spring源码深度解析》学习笔记——默认标签的解析
- spring源码剖析(二)Spring默认标签解析及注册实现
- Spring自定义标签解析
- Spring 源码解析 ---- 自定义标签
- Spring自定义标签的解析
- spring解析xml标签过程
- Spring源码解析-自定义标签解析
- Spring源码解析-自定义标签的解析
- spring 之 import标签、alias标签、beans标签 解析
- MQTT之阿里云接受推送消息
- 复杂链表的复制
- 2016年腾讯校招笔试题(研发岗)
- VS2015,C++目录问题
- iOS开发常见的宏定义(实用)
- spring默认标签解析
- Kinect与KinectFusion重建
- 智能指针的使用
- java-MD5加密
- QT编译缺-lgstapp-0.10等库
- BST树、B-树、B+树、B*树
- Volley源码浅析
- redis入门(一)
- 线刷和卡刷的区别以及步骤