每天一点点,Spring创建bean实例 AbstractAutowireCapableBeanFactory#createBeanInstance

131 阅读1分钟

Spring 执行创建bean实例逻辑AbstractAutowireCapableBeanFactory#createBeanInstance 1、确保当前类已加载

Class<?> beanClass = resolveBeanClass(mbd, beanName);

1.1、 AbstractBeanFactory#resolveBeanClass 1.1.1、如果已解析直接返回解析的class

if (mbd.hasBeanClass()) {
	return mbd.getBeanClass();
}

1.1.2、执行解析 AbstractBeanFactory#doResolveBeanClass

2、如果当前BeanDefinition设置的有Supplier方法,直接调用此方法生成bean对象

Supplier<?> instanceSupplier = mbd.getInstanceSupplier();
if (instanceSupplier != null) {
	return obtainFromSupplier(instanceSupplier, beanName);
}

2.1、AbstractAutowireCapableBeanFactory#obtainFromSupplier

instance = instanceSupplier.get();

3、判断有没有设置factory-method,如果有直接使用

if (mbd.getFactoryMethodName() != null) {
	return instantiateUsingFactoryMethod(beanName, mbd, args);
}

4、检查一下缓存中是否已经缓存了可用的构造方法和构造方法需要的参数,存在则直接使用

5、得到候选的构造函数

Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);

6、实例化

if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR ||mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
	return autowireConstructor(beanName, mbd, ctors, args);
}
return instantiateBean(beanName, mbd);