三、spring源码之获取指定bean方法流程(getBean、doGetBean)

doGetBean方法的大致流程

1、通过getSingleton(String beanName, boolean allowEarlyReference)方法从缓存中获取是否存在该bean

2、如果通过getSingleton获取到了bean,那么就会返回该bean。

(1)在返回之前还会把bean交给getObjectForBeanInstance方处理一下,这个方法作用是什么呢?看源码:

protected Object getObjectForBeanInstance(Object beanInstance, String name, String beanName, @Nullable RootBeanDefinition mbd) {
	//省略代码......
    //判断你的bean是不是FactoryBean,
    //如果不是FactoryBean,那么就属于正常的bean实例了,直接返回
	if (!(beanInstance instanceof FactoryBean) || BeanFactoryUtils.isFactoryDereference(name)) {
		return beanInstance;
	}
    //省略代码......
	if (object == null) {
		// Return bean instance from factory.
		FactoryBean<?> factory = (FactoryBean<?>) beanInstance;
		//省略代码......
		//你的bean是FactoryBean,那么就会通过FactoryBean的getObject方法获取真正的bean
		object = getObjectFromFactoryBean(factory, beanName, !synthetic);
	}
	return object;
}

看源码就知道,getObjectForBeanInstance就是判断你的bean是不是实现了FactoryBean,如果实现了,则需要调用getObject返回真正的bean。

3、如果通过getSingleton没有获取到bean,那么就会去创建bean,然后注入属性和后置处理等操作。最后返回该bean

创建bean的代码主要在这一段中,

调用getSingleton方法(注意这是重载方法,要和上面的分开,这个的第二个参数是ObjectFactory),

在该getSingleton内

(1)先调用createBean方法去创建bean(注入属性、后置处理器处理都在这里面)。在往该bean注入属性时,如果又需要依赖其他bean,那么此时就会递归调用doGetBean去获取被注入的bean的实例。

(这一步具体方法流程请看另一篇文章:https://blog.csdn.net/qq_36951116/article/details/100032254

(2)然后把创建完成的bean(已经注入了属性、并被后置处理器等处理完的最终版的bean)通过addSingleton添加到singletonObjects中。(addSingleton方法的作用请看这篇文章:https://blog.csdn.net/qq_36951116/article/details/100030814

sharedInstance = getSingleton(beanName, () -> {
		try {
			return createBean(beanName, mbd, args);
		}
		catch (BeansException ex) {
			// Explicitly remove instance from singleton cache: It might have been put there
			// eagerly by the creation process, to allow for circular reference resolution.
			// Also remove any beans that received a temporary reference to the bean.
			destroySingleton(beanName);
			throw ex;
		}
	});

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值