您的位置:首页 > 编程语言 > Java开发

spring默认标签解析

2016-09-17 15:38 483 查看
   上篇说到对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的注册已经差不多了,好多的地方没有说到,能力有限,多多指正!
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息