吃透Spring源码(九):Spring实例化(createBeanInstance)源码解析
一,createBeanInstance()方法概述
createBeanInstance 是Spring实例化的核心代码,它根据不同的情况会调 用四种实例化方法:
- obtainFromSupplier():通过Supplier实例化。
- instantiateUsingFactoryMethod():通过工厂方法实例化。
- autowireConstructor():用合适的构造函数实例化。
- instantiateBean():用无参构造函数实例化。
protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) {
// 确认需要创建的bean实例的类可以实例化
Class<?> beanClass = resolveBeanClass(mbd, beanName);
// 确保class不为空,并且访问权限是public
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());
}
/**
* ----------1,通过Supplier实例化------------
*/
Supplier<?> instanceSupplier = mbd.getInstanceSupplier();
if (instanceSupplier != null) {
return obtainFromSupplier(instanceSupplier, beanName);
}
/**
* ----------2,通过工厂方法实例化------------
*/
if (mbd.getFactoryMethodName() != null) {
return instantiateUsingFactoryMethod(beanName, mbd, args);
}
/**
* ----------3,用合适的构造函数实例化------------
*
* 一个类可能有多个构造器,所以Spring得根据参数个数、类型确定需要调用的构造器。
* 在使用构造器创建实例后,Spring会将解析过后确定下来的构造器或工厂方法保存在缓存中,
* 避免再次创建相同bean时再次解析
*/
// 标记下,防止重复创建同一个bean
boolean resolved = false;
// 是否需要自动装配,构造有参数的需要
boolean autowireNecessary = false;
// 如果没有参数
if (args == null) {
synchronized (mbd.constructorArgumentLock) {
// 一个类中有多个构造函数,每个构造函数都有不同的参数,所以调用前需要先根据参数锁定构造函数或对应的工厂方法
if (mbd.resolvedConstructorOrFactoryMethod != null) {
resolved = true;
autowireNecessary = mbd.constructorArgumentsResolved;
}
}
}
// 有构造参数的或者工厂方法
if (resolved) {
// 构造器有参数
if (autowireNecessary) {
// 构造函数自动注入
return autowireConstructor(beanName, mbd, null, null);
}
else {
// 使用默认构造函数构造
return instantiateBean(beanName, mbd);
}
}
// 从bean后置处理器中为自动装配寻找构造方法
Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR ||
mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
return autowireConstructor(beanName, mbd, ctors, args);
}
// 找出最合适的默认构造方法
ctors = mbd.getPreferredConstructors();
if (ctors != null) {
// 构造函数自动注入
return autowireConstructor(beanName, mbd, ctors, null);
}
/**
* ----------4,使用默认构造函数构造------------
*/
return instantiateBean(beanName, mbd);
}