下面我们一步步剖析doCreatBean办法,首先从createBeanInstance开端。
protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, Object[] args) {
// Make sure bean class is actually resolved at this point.
//解析Class
Class<?> beanClass = resolveBeanClass(mbd, beanName);
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());
}
if (mbd.getFactoryMethodName() != null) {
//如果存在工厂办法则应用工厂办法进行初始化
//如果在RootBeanDefinition中存在factoryMethodName属性,或说在配置文件中配置了
//factory-method,那末Spring会尝试应用instantiateUsingFactoryMethod(beanName, mbd, args)
//办法依据RootBeanDefinition中的配置生成bean的实例。
return instantiateUsingFactoryMethod(beanName, mbd, args);
}
// Shortcut when re-creating the same bean...
boolean resolved = false;
boolean autowireNecessary = false;
if (args == null) {
//一个类有多个结构函数,每一个结构函数都有不同的参数,所以须要依据参数锁定结构函数并进行初始化
synchronized (mbd.constructorArgumentLock) {
if (mbd.resolvedConstructorOrFactoryMethod != null) {
resolved = true;
autowireNecessary = mbd.constructorArgumentsResolved;
}
}
}
//如果已解析过则应用解析好的结构函数办法不须要再次锁定
//一个类中有多个结构函数,断定应用哪一个结构函数实例化进程比拟耗性状,所以采取缓存机制,如果已解析过则不须要
//反复解析而是直接从RootBeanDefinition中的属性resolvedConstructorOrFactoryMethod缓存的值去取,否则须要
//再次解析,并将解析的成果添加至RootBeanDefinition中的属性resolvedConstructorOrFactoryMethod中。
if (resolved) {
if (autowireNecessary) {
//结构函数主动注入
return autowireConstructor(beanName, mbd, null, null);
}
else {
//应用默许结构函数结构
return instantiateBean(beanName, mbd);
}
}
// Need to determine the constructor...
Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
if (ctors != null ||
mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_CONSTRUCTOR ||
mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
//结构函数主动注入
return autowireConstructor(beanName, mbd, ctors, args);
}
// No special handling: simply use no-arg constructor.
//如果既不存在工厂办法也不存在带有参数的结构函数,则应用默许的结构函数进行bean实例化。
return instantiateBean(beanName, mbd);
}p