1、获取单例
如果缓存中不存在已经加载的单例bean,就需要重头开始bean的加载过程,在spring中AbstracBeanFactory的 getSingleton的重载方法实现了bean的加载
![](https://i-blog.csdnimg.cn/blog_migrate/5483b12628e47d2f82428784ce3b749d.png)
1.1、检查缓存是否已经加载过,spring3.2是直接使用synchronized锁定需要同步的变量,4.0之后
Object singletonObject = this.singletonObjects.get(beanName);实例了一个对象去操作
1.2、检查
earlySingletonObjects里面是否保存beanName和bean实例之间的关系
1.3、如果还是没有,则需要根据beanName创建一个ObjectFactory,里面用于保存beanName和bean工厂之间的关系 beanName,ObjectFactory之间的关系,然后把值记录到earlySingletonObjects,同时移除singletonFactories里面beanName之间的关系
2、准备创建bean
在spring中真正可以干活的函数是以do开头的,对于createBean也是如此,只是做一些准备工作
![](https://i-blog.csdnimg.cn/blog_migrate/0e0f10f6c3af91aa20305d8d53312801.png)
2.1、根据设置的class属性或者根据className来解析class
![](https://i-blog.csdnimg.cn/blog_migrate/538894843b5e0a0dfe12b650298b24e1.png)
2.2、对override属性进行标记和验证
![](https://i-blog.csdnimg.cn/blog_migrate/8b43464d9020292a4f68c0d64d9b7a99.png)
2.3、应用初始化前的处理器,解析指定bean是否存在初始化前的短路操作
![](https://i-blog.csdnimg.cn/blog_migrate/d473abe6237452bcc3cb6a4f38ad8825.png)
2.4、创建bean
![](https://i-blog.csdnimg.cn/blog_migrate/8ac8596cd536c91b1c4044d159b55e55.png)