我们先看看这个方法的轮廓流程
![](https://img-blog.csdnimg.cn/20210526230253962.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMzMzYwNzI=,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/20210526230253888.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMzMzYwNzI=,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/20210526230253850.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMzMzYwNzI=,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/20210526230253916.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMzMzYwNzI=,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/20210526230253917.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMzMzYwNzI=,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/20210526230253910.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMzMzYwNzI=,size_16,color_FFFFFF,t_70)
这个getbean的轮廓方法很长.
先分两种情况:
一种是在缓存实例中能拿到bean, (主要是factroyBean的处理,
执行所有已注册的 BeanPostProcessor 的 postProcessAfterInitialization 方法)
![](https://img-blog.csdnimg.cn/20210526230253915.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMzMzYwNzI=,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/20210526230253876.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMzMzYwNzI=,size_16,color_FFFFFF,t_70)
前边是校验 (如果name以“&”为前缀,但是beanInstance不是FactoryBean,则抛异常) 通过之后是从缓存中获取到factroyBean的实例
![](https://img-blog.csdnimg.cn/20210526230253965.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMzMzYwNzI=,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/20210526230253680.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMzMzYwNzI=,size_16,color_FFFFFF,t_70)
从factroyBean中获取实例
执行所有已注册的 BeanPostProcessor 的 postProcessAfterInitialization 方法 -> object = postProcessObjectFromFactoryBean(object, beanName);
![](https://img-blog.csdnimg.cn/20210526230253953.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMzMzYwNzI=,size_16,color_FFFFFF,t_70)
另一种是拿不到
1.先判断如果是要创建这个bean会把beanName缓存到alreadyCreated 中
![](https://img-blog.csdnimg.cn/20210526230253786.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMzMzYwNzI=,size_16,color_FFFFFF,t_70)
2.根据beanName 拿到 MergedBeanDefinition
3.拿到当前bean所依赖的beanName集合,实例化自己之前先要实例化自己依赖的bean
3.1检查是否存在循环依赖,有则抛异常
3.2将两者依赖关系注册到缓存中
![](https://img-blog.csdnimg.cn/20210526230253812.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMzMzYwNzI=,size_16,color_FFFFFF,t_70)
3.3先实例化依赖bean
接下来分3中类型实例化bean
4.1单例类型
![](https://img-blog.csdnimg.cn/20210526230253963.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMzMzYwNzI=,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/20210526230253897.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMzMzYwNzI=,size_16,color_FFFFFF,t_70)
beforeSingletonCreation 吧正在实例化的bean添加到容器中 创建完成后这个方法afterSingletonCreation 吧从正在创建实例化容器中将beanName移除
![](https://img-blog.csdnimg.cn/20210526230253857.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMzMzYwNzI=,size_16,color_FFFFFF,t_70)
4.2原型类型
4.3其他类型