spring 获取bean 过程

spring 获取bean 过程, 其在AbstractBeanFactory

  1. 将bean 名称转换为实际的bean名称,实际逻辑为移除工厂bean名称前缀,如果是别名则找到实际名称
  2. 按照bean名称从单实例中获取,如果有且参数为空则使用单实例的bean否则开始创建。
  3. 创建流程,
    3.1 判断当前线程是否已在创建,如果在创建说明是循环引用,所以抛出异常
    3.2 如果本beanFactory 不存在beanDefinition,且存在上级beanFactory,从上级beanFactory 中获得,
    3.3. 实例化前检查
    3.3.1 获取此bean 的 beanDefiniton,且检查是否是虚拟的,如果是虚拟的则抛出异常,因为虚拟的不可实例化, 比如xml 中定义的 bean中
    3.3.2 实例化前 检查依赖bean并获取 @DependsOn, xml 中的 depends-on
    3.4 按照beandefition 中定义的bean类型实例化
    3.4.1 如果是单实例模式,按照单实例创建,
    3.4.2 如果是原型模式,重新创建
    3.4.3 其他范围创建
    3.5 检查要求的类型,并做转换。
    此时获取到bean
	protected <T> T doGetBean(
			String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly)
			throws BeansException {
	// 1.将bean 名称转换为实际的bean名称,实际逻辑为移除工厂bean名称前缀,如果是别名则找到实际名称
		String beanName = transformedBeanName(name);
		Object bean;

		// Eagerly check singleton cache for manually registered singletons.
		// 2 判断是否已单实例是否已实例化
		Object sharedInstance = getSingleton(beanName);
		if (sharedInstance != null && args == null) {
			if (logger.isTraceEnabled()) {
				if (isSingletonCurrentlyInCreation(beanName)) {
					logger.trace("Returning eagerly cached instance of singleton bean '" + beanName +
							"' that is not fully initialized yet - a consequence of a circular reference");
				}
				else {
					logger.trace("Returning cached instance of singleton bean '" + beanName + "'");
				}
			}
			bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
		}

		else {
			// Fail if we're already creating this bean instance:
			// We're assumably within a circular reference.
			// 3.1判断当前线程是否已在创建,如果在创建说明是循环引用,所以抛出异常
			if (isPrototypeCurrentlyInCreation(beanName)) {
				throw new BeanCurrentlyInCreationException(beanName);
			}

			// Check if bean definition exists in this factory.
			//3.2 如果本beanFactory 不存在beanDefinition,且存在上级beanFactory,从上级beanFactory 中获得,
			BeanFactory parentBeanFactory = getParentBeanFactory();
			if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
				// Not found -> check parent.
				String nameToLookup = originalBeanName(name);
				if (parentBeanFactory instanceof AbstractBeanFactory) {
					return ((AbstractBeanFactory) parentBeanFactory).doGetBean(
							nameToLookup, requiredType, args, typeCheckOnly);
				}
				else if (args != null) {
					// Delegation to parent with explicit args.
					return (T) parentBeanFactory.getBean(nameToLookup, args);
				}
				else if (requiredType != null) {
					// No args -> delegate to standard getBean method.
					return parentBeanFactory.getBean(nameToLookup, requiredType);
				}
				else {
					return (T) parentBeanFactory.getBean(nameToLookup);
				}
			}

			if (!typeCheckOnly) {
				markBeanAsCreated(beanName);
			}

			StartupStep beanCreation = this.applicationStartup.start("spring.beans.instantiate")
					.tag("beanName", name);
			try {
				if (requiredType != null) {
					beanCreation.tag("beanType", requiredType::toString);
				}
				//3.3.1 获取此bean 的 beanDefiniton,且检查是否是虚拟的,如果是虚拟的则抛出异常,因为虚拟的不可实例化
				RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
				checkMergedBeanDefinition(mbd, beanName, args);

				// Guarantee initialization of
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值