spring getBean的入口是在
一:查看缓存
解析一下获取条件,getSingleton()查看缓存有没有
如果有就调用getObjectForBeanInstance方法,这个方法在doGetBean里返回Bean的时候似乎都会执行一次,等会再看
二:检查本地和父工厂
先检查这个bean是不是作用域是不是原型,如果出现原型的话,可能循环依赖啥的处理不了就抛出异常
再去检查一下现在的工厂有没有父工厂或者有没有这个Bean的BeanDefinition,如果有父工厂且没有这个Bean的BeanDefinition再去父工厂检查有没有这个Bean。
三:创建bean
获取Bean的生命周期期间的各个属性BeanDefinition
再去寻找Bean所依赖的各个Bean,这一块有机会再看
之后在进行Bean的创建和实例化
先是创建singleton
我们先进getSingleton(String BeanName, ObjectFactory objectFactory)看看,这里的getObject是CreateBean的入口,一开始Bean的createBean都是在这里开始创建的
其中创建前后的工作不在这里讲了,这一部分与单例循环依赖有关
这个getSingleton(String BeanName, ObjectFactory objectFactory)方法结束后,就是上一张图的内容,只剩下之前我说的getObjectForBeanInstance()
接下来就是原型Bean的创建
准备工作预计还是跟循环依赖有关(个人估计是当两个原型Bean, b1和b2,b1创建依赖b2,然后去创建b2,然后b2,又依赖b1,而原型的性质是,每次需要时,都会new一个对象出来,以此反复,无限循环下去,这或许就是这方法缓存没有之后一开始就要检查原型Bean是否重复依赖的原因)
之后就是其他作用域Bean的创建
就不看了
四:
最后就是
看这个bean与所需要的类型对不对的上,对上就返回