依赖注入之Bean实例化前的准备

IOC容器虽然已经构造好,但现在的容器只是一个壳,对象间的依赖关系还未进行填充。那么接下来便分析填充依赖关系的过程,即依赖注入。依赖注入主要有两个过程,一个是实例化Bean,另一个是将依赖关系注入到Bean中。
依赖注入的入口是我们熟悉的getBean方法。
这里写图片描述
AbstractBeanFactory的doGetBean方法是具体实现依赖注入的地方
依赖注入之Bean实例化前的准备_第1张图片
依赖注入之Bean实例化前的准备_第2张图片
依赖注入之Bean实例化前的准备_第3张图片
依赖注入之Bean实例化前的准备_第4张图片
依赖注入之Bean实例化前的准备_第5张图片
依赖注入之Bean实例化前的准备_第6张图片
依赖注入之Bean实例化前的准备_第7张图片
方法中的代码较多,该从哪里分析起呢?上一篇分析到了将配置文件解析后的BeanDefinition保存到了容器中,并且beanName的别名也保存到了容器中,既然保存起来了,肯定就是要用的,不然保存干嘛它干嘛呢?那么就从beanName的别名使用开始分析起,也就是transformedBeanName方法。进入transformedBeanName的具体实现canonicalName方法
依赖注入之Bean实例化前的准备_第8张图片
这个方法的作用是根据传入的别名获取beanName,别名的注册过程分析请看上一篇文章。这个方法也解释了在注册别名的时候,为什么名字和别名相同的时候要从aliasMap删掉别名项。如果存在别名和名字相同的情况,这个canonicalName方法在依赖注入的时候就显得有些多余了。
接着往下看,获取到beanName之后,根据beanName从缓存或者ObjectFactory中获取Bean。
别名的使用刚已分析,接下来看BeanDefinition的使用。BeanDefinition的具体使用在getMergedLocalBeanDefinition方法中。
依赖注入之Bean实例化前的准备_第9张图片
进入getBeanDefinition方法
依赖注入之Bean实例化前的准备_第10张图片
前面保存在IOC容器中的BeanDefinition在这里被取了出来,并且被转换成了RootBeanDefinition类型,并且在转换的过程中如果BeanDefinition的父类不为空,则把父类的属性也合并到RootBeanDefinition中,所以getMergedLocalBeanDefinition方法的作用就是获取缓存的BeanDefinition对象并合并其父类和本身的属性。
接下来通过递归的方式获取当前Bean的所有依赖Bean。
依赖注入之Bean实例化前的准备_第11张图片
分析到这里,Bean实例化前的准备工作已经差不多了。鉴于Bean实例化过程非常复杂,因此决定在下一篇中单独分析。
未完待续。。。。。。

你可能感兴趣的:(spring)