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、检查一下缓存中是否已经缓存了可用的构造方法和构造方法需要的参数,存在则直接使用
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);