阅读背景:

bean的加载(八)创建bean的实例

来源:互联网 

下面我们一步步剖析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




你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: