spring源码-refresh中的bean初始化getBean方法(中)
我们看完第一部分再来看第二部分,第二部分代码量较多,从265行的else开始到381行结束
我们慢慢来看
首先我们来说说这一块

因为我们在else之前我们尝试去获取过单例并想进入判断,但是为空,那么就说明这个bean要么没创建要么就不是一个单例的bean,那么进入else就得判断一下是否是多例正在创建,如果正在创建,我们就抛出异常,因为没有办法解决多例的循环依赖
如果没有,那么我们就去获取当前实例的父FactoryBean

首先拿到parentBeanFactory,然后如果parentBeanFactory存在,且beanName在BeanDefinitionMaps中找不到注册的BeanDefintion那么就有可能在parentBeanFactory中,我们进入首先拿到最原始的BeanName,我们需要去查找parentBeanFactory所以把原来去掉&的BeanName重新加上,并赋值给nameToLookUp,然后判断如果是AbstractBeanFactory的子类,那么就强转成最顶级的接口去实现doGetBean方法,同样的下面的else if都是通过不同的参数进行的重载来获取bean
如果不是那么就看typeCheckOnly,这里我们传进来的是false,那么一定会执行到markBeanAsCreated方法,那么这个typeCheckOnly是什么意思?仅仅只做类型的检查,当 typeCheckOnly=true 时,表示当前调用 仅是为了检查 bean 的类型(例如判断 bean 是否匹配某种类型),而非真正需要获取 bean 实例。但是在我们getBean里面并不是仅仅只做类型的检查,我们还需要去获取到bean初始化,那么我们会把当前的name标记为已创建
然后再来看这一块

这一块是在做什么,首先getMergedLocalBeanDefintion同样是拿到父类BeanDefintion,同时还做了xml的genericBeandefinition的获取,将他们合并成一个rootBeanDefintion,然后检查一下
如果是抽象的直接抛异常,因为抽象的注入不了,然后我们去getDependsOn,我们去拿有没有使用到DependsOn注解的Bean,它的意思是当前我们的Bean要进行初始化的时候要依赖于哪些Bean,这里和Autowired的IOC注入要区分开,这里的意思是我们想要初始化A就必须先初始化B,那么如果能找到有dependsOn的bean,那么我们进来,既然说了先初始化A,那么就要先初始化依赖的B,那么就是registerBeanDefinition然后去getBean初始化,这里就是检查有没有dependsOn的注解,如果有那就把dependsOn的bean赶紧做初始化,这里的抛异常是什么情况,比如说A dependsOnB B也dependsOnA,这样就会报异常
紧接着看下一块代码

这里就要开始创建Bean实例了,这里如果是单例bean,那么就会去调用getSingleton的函数式编程

这里和前面的getSingleton是重载方法,所以他们两干的事情是差不多的都是去做getObject,但是这里通过函数式编程将createBean传入进去,那么在这个方法中调用到getObject那么就相当于直接调用到createBean,然后去getObjectForBeanInstance方法获取bean实例
然后是prototype类型的

prototypeInstance就不用去缓存池中拿了,处理了前置和后置然后直接返回一个新创建的即可
还有就是除了这两个模式以外的,都走下面这个分支

比如request之类的,就是在这个分支中createBean,也是一个道理,先从拿到scope名字,然后再通过scope名字拿到scope,从scope中去getBean进行createBean的创建,同时也要执行前置和后置处理。

浙公网安备 33010602011771号