SpringBoot 源码阅读(13):getBean

getBean

通过getBean的源码可以了解Spring Bean的加载过程

AbstractApplicationContext

@Override
public Object getBean(String name) throws BeansException {
   
	assertBeanFactoryActive();
	return getBeanFactory().getBean(name);
}

AbstractBeanFactory
本节各个函数只看AbstractBeanFactory中的实现,在子类中对一些函数进行了扩展(如AbstractAutowireCapableBeanFactory中的getObjectForBeanInstance),相应的功能后面再具体看。

@Override
public Object getBean(String name) throws BeansException {
   
	return doGetBean(name, null, null, false);
}

先大致看下整体源码:

protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType,
		@Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {
   

	//name转换
	final String beanName = transformedBeanName(name);
	Object bean;

	//尝试单例获取
	// Eagerly check singleton cache for manually registered singletons.
	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.
		if (isPrototypeCurrentlyInCreation(beanName)) {
   
			throw new BeanCurrentlyInCreationException(beanName);
		}

		//当前工厂不存在该bean且存在父工厂,尝试从父工厂获取
		// Check if bean definition exists in this factory.
		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);
			}
		}
		
		//标记该bean
		if (!typeCheckOnly) {
   
			markBeanAsCreated(beanName);
		}

		try {
   
			//获取bean定义
			final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
			checkMergedBeanDefinition(mbd, beanName, args);

			//获取bean依赖的bean
			// Guarantee initialization of beans that the current bean depends on.
			String[] dependsOn = mbd.getDependsOn();
			if (dependsOn != null) {
   
				for (String dep : dependsOn) {
   
					if (isDependent(beanName, dep)) {
   
						throw new BeanCreationException(mbd.getResourceDescription(), beanName,
								"Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");
					}
					registerDependentBean(dep, beanName);
					try {
   
						getBean(dep);
					}
					catch (NoSuchBeanDefinitionException ex) {
   
						throw new BeanCreationException(mbd.getResourceDescription(), beanName,
								"'" + beanName + "' depends on missing bean '" + dep + "'", ex);
					}
				}
			}

			//根据模式创建实例
			// Create bean instance.
			if (mbd.isSingleton()) {
   
				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;
					}
				});
				bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
			}

			else if (mbd.isPrototype()) {
   
				// It's a prototype -> create a new instance.
				Object prototypeInstance = null;
				try {
   
					beforePrototypeCreation(beanName);
					prototypeInstance = createBean(beanName, mbd, args);
				}
				finally {
   
					afterPrototypeCreation(beanName);
				}
				bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
			}

			else {
   
				String scopeName = mbd.getScope();
				final Scope scope = this.scopes.get(scopeName);
				if (scope == null) {
   
					throw new IllegalStateException("No Scope registered for scope name '" + scopeName + "'");
				}
				try {
   
					Object scopedInstance = scope.get(beanName, () -> {
   
						beforePrototypeCreation(beanName);
						try 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值