spring源码分析(三)-创建bean的源码分析

81 阅读7分钟

spring容器refresh方法源码分析(二)接着前面讲:

文章目录

finishBeanFactoryInitialization初始化所有单例的bean(懒加载除外)最重要

直接看抽象类AbstractApplicationContext中的源码:

protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
		// Initialize conversion service for this context.
		// 初始化上下文的转换服务conversionService,
		if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) &&
				beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)) {
			beanFactory.setConversionService(
					beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class));
		}

		// Register a default embedded value resolver if no bean post-processor
		// (such as a PropertyPlaceholderConfigurer bean) registered any before:
		// at this point, primarily for resolution in annotation attribute values.
		// 容器是否注册了嵌入值解析器,如果没有注册默认的嵌入值解析器(主要用于注解属性值的解析)
		if (!beanFactory.hasEmbeddedValueResolver()) {
			beanFactory.addEmbeddedValueResolver(new StringValueResolver() {
				@Override
				public String resolveStringValue(String strVal) {
					return getEnvironment().resolvePlaceholders(strVal);
				}
			});
		}

		// Initialize LoadTimeWeaverAware beans early to allow for registering their transformers early.
		// 初始化LoadTimeWeaverAware对象
		String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);
		for (String weaverAwareName : weaverAwareNames) {
			//getBean也会加载bean
			getBean(weaverAwareName);
		}

		// Stop using the temporary ClassLoader for type matching.
		// 停止使用临时类型匹配的类加载器。
		beanFactory.setTempClassLoader(null);

		// Allow for caching all bean definition metadata, not expecting further changes.
		// 冻结所有bean定义,不允许修改了
		beanFactory.freezeConfiguration();

		// Instantiate all remaining (non-lazy-init) singletons.
		// 实例化所有(非懒加载) 单利bean
		beanFactory.preInstantiateSingletons();
	}

点到方法preInstantiateSingletons,是这个类的方法DefaultListableBeanFactory:

@Override
	public void preInstantiateSingletons() throws BeansException {
		if (logger.isDebugEnabled()) {
			logger.debug("Pre-instantiating singletons in " + this);
		}

		// Iterate over a copy to allow for init methods which in turn register new bean definitions.
		// While this may not be part of the regular factory bootstrap, it does otherwise work fine.
		// 创建beanDefinitionNames的副本beanNames用于后续的遍历,可能后续通过init方法注册新的bean定义
		List<String> beanNames = new ArrayList<String>(this.beanDefinitionNames);

		// Trigger initialization of all non-lazy singleton beans...
		// 遍历,初始化非懒加载bean
		for (String beanName : beanNames) {
			// 获取beanName的RootBeanDefinition
			RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
			// bd,表示bean定义,不是抽象的&& 单利的 && 不是懒加载
			if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
				// 判断是否是工厂bean
				if (isFactoryBean(beanName)) {
					// 通过beanName获取工厂bean实例,&+beanName;工厂bean如果不加&会执行factoryBean的getObject方法
					final FactoryBean<?> factory = (FactoryBean<?>) getBean(FACTORY_BEAN_PREFIX + beanName);
					// 判断这个工厂bean是否优先初始化
					boolean isEagerInit;
					if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
						isEagerInit = AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
							@Override
							public Boolean run() {
								return ((SmartFactoryBean<?>) factory).isEagerInit();
							}
						}, getAccessControlContext());
					}
					else {
						isEagerInit = (factory instanceof SmartFactoryBean &&
								((SmartFactoryBean<?>) factory).isEagerInit());
					}
					if (isEagerInit) {
						// 如果渴望先初始化,则通过getBean初始化
						getBean(beanName);
					}
				}
				else {
					// 不是工厂bean,通过getBean初始化bean
					getBean(beanName);
				}
			}
		}

		// Trigger post-initialization callback for all applicable beans...
		// 触发所有SmartInitializingSingleton的后初始化回调
		for (String beanName : beanNames) {
			Object singletonInstance = getSingleton(beanName);
			if (singletonInstance instanceof SmartInitializingSingleton) {
				final SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;
				//触发SmartInitializingSingleton实现类的afterSingletonsInstantiated方法
				if (System.getSecurityManager() != null) {
					AccessController.doPrivileged(new PrivilegedAction<Object>() {
						@Override
						public Object run() {
							smartSingleton.afterSingletonsInstantiated();
							return null;
						}
					}, getAccessControlContext());
				}
				else {
					smartSingleton.afterSingletonsInstantiated();
				}
			}
		}
	}

getBean

这时候发现getBean方法是最重要,通过名字应该是获取bean,但是创建bean的方法也封装在了这个方法:
源码:

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

	protected <T> T doGetBean(
			final String name, final Class<T> requiredType, final Object[] args, boolean typeCheckOnly)
			throws BeansException {
		//解析beanName,解析别名,去掉FactoryBean的前缀&
		final String beanName = transformedBeanName(name);
		//返回的bean
		Object bean;

		// Eagerly check singleton cache for manually registered singletons.
		// 尝试从缓存中获取beanName的实例(重要)
		Object sharedInstance = getSingleton(beanName);
		if (sharedInstance != null && args == null) {
			// 如果beanName的实例存在于缓存中
			if (logger.isDebugEnabled()) {
				if (isSingletonCurrentlyInCreation(beanName)) {
					logger.debug("Returning eagerly cached instance of singleton bean '" + beanName +
							"' that is not fully initialized yet - a consequence of a circular reference");
				}
				else {
					logger.debug("Returning cached instance of singleton bean '" + beanName + "'");
				}
			}
			// 下面这个方法:如果是普通 Bean 的话,直接返回 sharedInstance,
			// 如果是 FactoryBean 的话,返回它创建的那个实例对象
			bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
		}

		else {
			// Fail if we're already creating this bean instance:
			// We're assumably within a circular reference.
			// 创建过了此 beanName 的 scope为 prototype 类型的 bean,那么抛异常,
			// 往往是因为陷入了循环依赖
			if (isPrototypeCurrentlyInCreation(beanName)) {
				throw new BeanCurrentlyInCreationException(beanName);
			}

			// Check if bean definition exists in this factory.
			// 获取beanFactory,检测beanDefinition在容器中是否存在
			BeanFactory parentBeanFactory = getParentBeanFactory();
			if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
				// Not found -> check parent.
				// 将别名解析成真正的beanName
				String nameToLookup = originalBeanName(name);
				// 尝试在父容器中获取bean实例
				if (args != null) {
					// Delegation to parent with explicit args.
					// 返回父容器的结果
					return (T) parentBeanFactory.getBean(nameToLookup, args);
				}
				else {
					// No args -> delegate to standard getBean method.
					return parentBeanFactory.getBean(nameToLookup, requiredType);
				}
			}

			if (!typeCheckOnly) {
				// typeCheckOnly 为 false,将当前 beanName 放入一个 alreadyCreated 的 Set 集合中。
        //这里面删除了对应的beanName 的 MergedBeanDefinition
				markBeanAsCreated(beanName);
			}

			try {
			  // 根据beanName重新获取MergedBeanDefinition(前面删除了对应的MergedBeanDefinition,这边获取个新的)
				final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
				//检查MergedBeanDefinition
				checkMergedBeanDefinition(mbd, beanName, args);

				// Guarantee initialization of beans that the current bean depends on.
        // 拿到当前bean的所有依赖bean,实例化自己之前需要先实例化自己的依赖(depends on 属性)
				String[] dependsOn = mbd.getDependsOn();
				if (dependsOn != null) {
					for (String dep : dependsOn) {
					  // 检查是否存在循环依赖,depends on不能循环依赖
						if (isDependent(beanName, dep)) {
							throw new BeanCreationException(mbd.getResourceDescription(), beanName,
									"Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");
						}
						// 将dep和beanName注册到缓存
						registerDependentBean(dep, beanName);
						try {
						  // 获取dep对应的bean实例,如果没有则创建
							getBean(dep);
						}
						catch (NoSuchBeanDefinitionException ex) {
							throw new BeanCreationException(mbd.getResourceDescription(), beanName,
									"'" + beanName + "' depends on missing bean '" + dep + "'", ex);
						}
					}
				}

				// Create bean instance.
        // 创建bean实例
				if (mbd.isSingleton()) {
				  // scope为singleton的bean创建(新建ObjectFactory,重写getObject方法)
					sharedInstance = getSingleton(beanName, new ObjectFactory<Object>() {
						@Override
						public Object getObject() throws BeansException {
							try {
							  // 创建bean,最重要
								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;
							}
						}
					});
					// 返回beanName对应的实例对象
					bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
				}

				else if (mbd.isPrototype()) {
				  // scope为prototype的bean创建
					// It's a prototype -> create a new instance.
					Object prototypeInstance = null;
					try {
					  // 创建实例前的操作(将beanName保存到prototypesCurrentlyInCreation缓存中)
						beforePrototypeCreation(beanName);
						// 创建实例
						prototypeInstance = createBean(beanName, mbd, args);
					}
					finally {
					  //创建实例后的操作(将创建完的beanName从prototypesCurrentlyInCreation缓存中移除)
						afterPrototypeCreation(beanName);
					}
					// 返回beanName对应的实例对象
					bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
				}

				else {
				  // 其他scope的bean创建,可能是request之类的,方法同上
					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, new ObjectFactory<Object>() {
							@Override
							public Object getObject() throws BeansException {
								beforePrototypeCreation(beanName);
								try {
									return createBean(beanName, mbd, args);
								}
								finally {
									afterPrototypeCreation(beanName);
								}
							}
						});
						bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);
					}
					catch (IllegalStateException ex) {
						throw new BeanCreationException(beanName,
								"Scope '" + scopeName + "' is not active for the current thread; consider " +
								"defining a scoped proxy for this bean if you intend to refer to it from a singleton",
								ex);
					}
				}
			}
			catch (BeansException ex) {
				cleanupAfterBeanCreationFailure(beanName);
				throw ex;
			}
		}

		// Check if required type matches the type of the actual bean instance.
    //检查所需类型是否与实际的bean对象的类型匹配
		if (requiredType != null && bean != null && !requiredType.isInstance(bean)) {
			try {
			  // 类型不对,转换类型
				return getTypeConverter().convertIfNecessary(bean, requiredType);
			}
			catch (TypeMismatchException ex) {
				if (logger.isDebugEnabled()) {
					logger.debug("Failed to convert bean '" + name + "' to required type '" +
							ClassUtils.getQualifiedName(requiredType) + "'", ex);
				}
				throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
			}
		}
		// 返回bean实例
		return (T) bean;
	}
getSingleton方法

getSingleton方法重要,就是解决循环依赖,创建早期对象的地方:
循环依赖就是,A对象依赖B对象,B对象依赖A,这段代码就是通过爆光对应Bean实例的ObjectFactory,通过ObjectFactory创建一个早期的bean对象,此时对象还未进行属性赋值,因为后续处理都是通过缓存中获取的,并且不在通过ObjectFactory在进行创建,此时缓存中的对象地址值是不会改变的,这时候就能够解决循环依赖,具体的代码还是比较复杂的;
这里面使用的几个属性:这三个属性构成了三级缓存,用来解决循环依赖

  1. singletonFactories 缓存 new HashMap<String, ObjectFactory<?>>(16);
  2. earlySingletonObjects缓存 new HashMap<String, Object>(16);
  3. singletonObjects 缓存new ConcurrentHashMap<String, Object>(256);
	@Override
	public Object getSingleton(String beanName) {
		return getSingleton(beanName, true);
	}

	protected Object getSingleton(String beanName, boolean allowEarlyReference) {
		//从单例对象缓存中获取对应的beanName对象
		Object singletonObject = this.singletonObjects.get(beanName);
		//单例缓存中没有,该beanName对象正在创建中
		if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
			//加锁
			synchronized (this.singletonObjects) {
				//早期的单例对象缓存中获取单单例对象,(通过ObjectFactory创建出来的对象.未进行属性填充)
				singletonObject = this.earlySingletonObjects.get(beanName);
				//早期单例对象中没有,允许创建早期单例对象引用
				if (singletonObject == null && allowEarlyReference) {
					//从单例工厂对象中返回对应beanName的单例ObjectFactory
					ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
					if (singletonFactory != null) {
						//通过单例对象工厂返回对象,并放到早期暴露的单例对象map中,将单例工厂对象里面对应名称的单例工厂移除,
						// 因为已经通过单例工厂返回创建了对象,单例的,就不需要对应的对象工厂
						singletonObject = singletonFactory.getObject();
						this.earlySingletonObjects.put(beanName, singletonObject);
						this.singletonFactories.remove(beanName);
					}
				}
			}
		}
		return (singletonObject != NULL_OBJECT ? singletonObject : null);
	}
isDependent 检查是否依赖指定类
	protected boolean isDependent(String beanName, String dependentBeanName) {
		synchronized (this.dependentBeanMap) {
			return isDependent(beanName, dependentBeanName, null);
		}
	}

	private boolean isDependent(String beanName, String dependentBeanName, Set<String> alreadySeen) {
	  // 检查过的直接跳过
		if (alreadySeen != null && alreadySeen.contains(beanName)) {
			return false;
		}
		//将别名解析为真正的名称
		String canonicalName = canonicalName(beanName);
		// 拿到依赖集合
		Set<String> dependentBeans = this.dependentBeanMap.get(canonicalName);
		if (dependentBeans == null) {
			return false;
		}
		if (dependentBeans.contains(dependentBeanName)) {
			return true;
		}
		// 循环检查,检查以来的canonicalName是否存在被dependentBeanName依赖的(隔层依赖)
		for (String transitiveDependency : dependentBeans) {
			if (alreadySeen == null) {
				alreadySeen = new HashSet<String>();
			}
			//已经检查过的添加到alreadySeen,避免重复检查
			alreadySeen.add(beanName);
			if (isDependent(transitiveDependency, dependentBeanName, alreadySeen)) {
				return true;
			}
		}
		return false;
	}

下篇文章讲:createBean方法;