IOC容器构造之注册BeanDefinition源码分析

来源:互联网 发布:retintex算法 编辑:程序博客网 时间:2024/06/05 10:04

解析完配置文件,接下来便是BeanDefinition的注册了。为了不至于每次用到配置信息的时候都去解析一遍配置文件,我们需要将解析结果保存起来。而保存解析结果这个过程就是BeanDefinition的注册。既然是保存,那就需要一个保存的容器,这个容器就是HashMap。于是BeanDefinition的注册就变成了将解析之后的BeanDefinition信息保存在HashMap中这样一个操作。具体实现过程,请看源码分析。
BeanDefinition注册开始
注册从BeanDefinitionReaderUtils类的registerBeanDefinition方法开始。
beanName和别名的注册
从代码中可以看出,BeanDefinition的注册分成了两部分,通过beanName的注册和通过别名的注册。先来分析通过beanName注册BeanDefinition的方式。
registry的类型
registry此时的类型是DefaultListableBeanFactory,那进入DefaultListableBeanFactory的 registerBeanDefinition方法。
这里写图片描述这里写图片描述
这个方法中先判断是不是有相同名字的BeanDefinition已经注册过了,如果有,但是不允许覆盖,那么只能让程序抛出异常。如果没有相同的名字注册过,那就执行正常的注册过程,以beanName为key,BeanDefinition为value保存在beanDefinitionMap中。
接下来再看通过别名注册BeanDefinition的方式。
这里写图片描述
通过别名注册的方式也比较简单,如果beanName和别名相同的话,就从aliasMap中删掉别名。为什么要删掉呢?因为别名和beanName相同,在获取BeanDefinition的时候,不管是根据beanName来获取还是根据别名来获取,key都是一样,所以这样的别名没别要保存起来。如果beanName和别名不相同的话,就把别名当做key,beanName当做value保存在aliasMap中,到此BeanDefinition注册完成。当然,在分析源码的过程中可能有些地方没有分析到。前面也有提到,我们分析是主线,也就是主要的过程,至于非常细节的部分,感兴趣的朋友也可以自己研究下,毕竟Spring源码是如此的博大精深。
总结:BeanDefinition的注册过程实质就是将BeanDefinition保存在以beanName为key,BeanDefinition为value的Map中的过程。到此IOC容器已经构建好,但这时的IOC容器还只是光有一个壳,没有内容。我们知道IOC容器的作用是管理对象之间的引用关系,也就是对象之间的引用关系还没有填充到IOC容器里面。那么下面要做的事就是去填充IOC容器。
未完待续。。。。。。

1 0
原创粉丝点击