本文只是分析一下doCreateBean的表面代码,其中每块的细节逻辑后续文章分析
在看源码中,我们如果看到前面有一个do,不用质疑,一般都是比较重要的方法比如,doScan doGetBean以及doCreateBean
protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException {
BeanWrapper instanceWrapper = null;
if (mbd.isSingleton()) {
instanceWrapper = this.factoryBeanInstanceCache.remove(beanName); // 可能已经创建过了
}
if (instanceWrapper == null) {
// 真正得到一个实例,这里面包括@Bean的逻辑,推断构造方法等,后面介绍
instanceWrapper = createBeanInstance(beanName, mbd, args);
}
Object bean = instanceWrapper.getWrappedInstance();
Class<?> beanType = instanceWrapper.getWrappedClass();
if (beanType != NullBean.class) {
mbd.resolvedTargetType = beanType;
}
synchronized (mbd.postProcessingLock) {
if (!mbd.postProcessed) {
try {
// BeanPostProcessors ,spring的一个扩展点,在这里还可以对Beandefinition做修改
// 例如给属性直接赋值,但是这个时候要去修改beanClass是不行的了
applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
}
catch (Throwable ex) {
throw new BeanCreationException(mbd.getResourceDescription(), beanName,
"Post-processing of merged bean definition failed", ex);
}
mbd.postProcessed = true;
}
}
// 解决循环依赖逻辑,三级缓存,后面分析
boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
isSingletonCurrentlyInCreation(beanName));
if (earlySingletonExposure) {
addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
}
Object exposedObject = bean;
populateBean(beanName, mbd, instanceWrapper); // 属性填充
exposedObject = initializeBean(beanName, exposedObject, mbd); // 初始化
// 循环依赖省略...
// 注册Bean的销毁逻辑
registerDisposableBeanIfNecessary(beanName, bean, mbd);
return exposedObject;
}
通过以上代码,大致逻辑是
判断是不是创建过了
没有创建那么实例化出来一个bean对象 --实例化逻辑后面文章介绍
经过一个生命周期扩展点MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition,这一步也是非常的重要,会寻找出一些注入点以便后面属性填充,做依赖注入
循环依赖解决
属性填充 依赖注入
初始化bean 初始化前,初始化后,执行初始化方法等
注册销毁bean的逻辑
以上就是doCreateBean的逻辑,本文只是做一个初探,至于实例化过程,循环依赖解决,属性填充,初始化过程,以及更多的扩展点,后面文章一一分析
欢迎关注,学习不迷路!