方法执行流程
- 判断可以访问
- 通过 Supplier<?> 创建对象
- 通过工厂方法创建对象
- 使用合适的构造函数创建对象
- 使用无参构造函数创建对象
方法完整内容
protected BeanWrapper createBeanInstance(String beanName
, RootBeanDefinition mbd, @Nullable Object[] args) {
// Make sure bean class is actually resolved at this point.
// 得到对应的Class对象
Class<?> beanClass = resolveBeanClass(mbd, beanName);
// 判断Class对象;访问修饰符;nonPublicAccessAllowed默认为true
if (beanClass != null && !Modifier.isPublic(beanClass.getModifiers())
&& !mbd.isNonPublicAccessAllowed()) {
throw new BeanCreationException(mbd.getResourceDescription(), beanName,
"Bean class isn't public, and non-public access not allowed: " + beanClass.getName());
}
// 通过给定的函数获取对象
Supplier<?> instanceSupplier = mbd.getInstanceSupplier();
if (instanceSupplier != null) {
return obtainFromSupplier(instanceSupplier, beanName);
}
// 工厂方法获取对象
if (mbd.getFactoryMethodName() != null) {
return instantiateUsingFactoryMethod(beanName, mbd, args);
}
// 一个类可能有多个构造器,Spring根据参数个数、类型确定需要调用的构造器
// Shortcut when re-creating the same bean...
// 标记防止重复创建
boolean resolved = false;
// 是否需要自动装配
boolean autowireNecessary = false;
// 如果没有参数
if (args == null) {
synchronized (mbd.constructorArgumentLock) {
// 已经缓存的构造方法或者工厂方法(Spring会将解析过后确定下来的构造器或工厂方法保存在缓存中,
// 避免再次创建相同bean时再次解析)
if (mbd.resolvedConstructorOrFactoryMethod != null) {
resolved = true;
autowireNecessary = mbd.constructorArgumentsResolved;
}
}
}
// 有构造参数或者工厂方法
if (resolved) {
if (autowireNecessary) {
// 构造器有参数,构造函数自动注入
return autowireConstructor(beanName, mbd, null, null);
} else {
// 默认构造函数
return instantiateBean(beanName, mbd);
}
}
// Candidate constructors for autowiring?
// 从bean后置处理器中为自动装配寻找构造方法
Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR ||
mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
return autowireConstructor(beanName, mbd, ctors, args);
}
// Preferred constructors for default construction?
// 找出最合适的默认构造方法
ctors = mbd.getPreferredConstructors();
if (ctors != null) {
// 构造函数自动注入
return autowireConstructor(beanName, mbd, ctors, null);
}
// No special handling: simply use no-arg constructor.
// 使用默认无参构造函数创建对象
return instantiateBean(beanName, mbd);
}