bean的加载过程比bean的解析复杂的多,主要是AbstractBeanFactory下面的doGetBean方法实现
1、转换对应的beanName
传入的参数可能是bean的别名,也可能是FactoryBean,所以需要在这里转换
![](https://i-blog.csdnimg.cn/blog_migrate/ac6b5f7ebc630401ab56243ef2db7f7a.png)
2、尝试从缓存中加载单例
单例在容器中只会创建一次,后面直接获取bean就行了,首先尝试从缓存中拿,如果不成功就从singletonFactories,因为创建单例存在依赖注入,为了避免循环依赖,在bean没有创建完成时就创建bean的ObjectFactory加到缓存,依赖直接使用ObjectFactory就可以了
![](https://i-blog.csdnimg.cn/blog_migrate/7b4ce37d8bcc768bcb9c0d4d9cfd645a.png)
3、bea的实例化
从第二步缓存哪里拿到bean的原始状态,需要对bean实例化
![](https://i-blog.csdnimg.cn/blog_migrate/78a57ca34d2b2cf5ffe6aeea8fc7b231.png)
4、原型模式的依赖检查
只有在单例才会解决的循环依赖
![](https://i-blog.csdnimg.cn/blog_migrate/f3bfafd14736ced7c03790edc65a4902.png)
5、检测parentBeanFactory
如果加载的XML配置文件中不报航beanNane的配置,则需要到parentBeanFactory,然后在递归调用getBean
![](https://i-blog.csdnimg.cn/blog_migrate/97aa2869141113148ec30880ef1b4dff.png)
6、将配置文件的GernericBeanDefinition转换为RootBeanDefinition
xml读取的信息都是存储在GernericBeanDefinition里面,但后面的bean处理都是针对RootBeanDefinition,所以要在这里处理
![](https://i-blog.csdnimg.cn/blog_migrate/8566a8663db99d68714fa8a0190952c4.png)
7、寻找依赖
bean在初始化的过程中很可能用到某些属性,有可能是动态配置的,可能依赖其它的bean,在初始化bean的时候会先初始化依赖的bean
![](https://i-blog.csdnimg.cn/blog_migrate/669627bd055f1bdf61c304fba08d60ee.png)
8、针对不同的scope进行bean的创建
![](https://i-blog.csdnimg.cn/blog_migrate/36835bffd9f4fd0468d451787ff5864b.png)
9、类型转换
转换成指定类型
![](https://i-blog.csdnimg.cn/blog_migrate/68e33b3837493d14f7736ab5188498bd.png)