Bean创建过程

书中人 2019年09月17日 1,630次浏览

从AbstractAutowireCapableBeanFactory说起、AbstractAutowireCapableBeanFactory顾明思议、是带有自动注入功能的BeanFactory、我们先看他的类继承结构

如上图所示、AbstractAutowireCapableBeanFactory实现了AbstractBeanFactory说明其本身实现了BeanFactory的功能、包括bean的创建。

其次AbstractAutowireCapableBeanFactory也实现了AutowireCapableBeanFactory扩展接口、表明其具有自动注入属性的功能。由于其是一个抽象的类、所以由此猜测AbstractAutowireCapableBeanFactory实现了bean创建的默认行为以及基础的属性注入功能,来看spring源码对AbstractAutowireCapableBeanFactory的注释:

/**
 * Abstract bean factory superclass that implements default bean creation,
 * with the full capabilities specified by the {@link RootBeanDefinition} class.
 * Implements the {@link org.springframework.beans.factory.config.AutowireCapableBeanFactory}
 * interface in addition to AbstractBeanFactory's {@link #createBean} method.
 *
 * <p>Provides bean creation (with constructor resolution), property population,
 * wiring (including autowiring), and initialization. Handles runtime bean
 * references, resolves managed collections, calls initialization methods, etc.
 * Supports autowiring constructors, properties by name, and properties by type.
 *
 * <p>The main template method to be implemented by subclasses is
 * {@link #resolveDependency(DependencyDescriptor, String, Set, TypeConverter)},
 * used for autowiring by type. In case of a factory which is capable of searching
 * its bean definitions, matching beans will typically be implemented through such
 * a search. For other factory styles, simplified matching algorithms can be implemented.
 *
 * <p>Note that this class does <i>not</i> assume or implement bean definition
 * registry capabilities. See {@link DefaultListableBeanFactory} for an implementation
 * of the {@link org.springframework.beans.factory.ListableBeanFactory} and
 * {@link BeanDefinitionRegistry} interfaces, which represent the API and SPI
 * view of such a factory, respectively.
 */
 

简单翻译以上意思是:

它是bean工厂的超类、此bean工厂实现了bean创建功能。创建的bean具有RootBeanDefinition指定的全部功能。并且实现了AbstractBeanFactory的createBean方法。同时它也实现了AutowireCapableBeanFactory接口

提供了bean的创建(带有构造器解析),属性注入,和初始化。处理运行时bean引用。解析收管理的集合。调用初始化的方法等等功能,提供了构造器注入、通过名称注入属性、通过类型注入属性。

其中提供给子类覆盖的主要模板方法是resolveDependency(DependencyDescriptor, String, Set, TypeConverter)这个方法用于通过类型注入的时候、提供多态的机制。

注意一点是:

AbstractAutowireCapableBeanFactory没有bean定义注册的功能、因为他并没有实现BeanDefinitionRegistry接口、注意他和DefaultListableBeanFactory的区别、DefaultListableBeanFactory它即实现了ListableBeanFactory同时也实现了BeanDefinitionRegistry。看一个类图我们就明白了。

  1. AbstractBeanFactory---->doCreateBean开始说起:
/**
	 * Create a bean instance for the given merged bean definition (and arguments).
	 * The bean definition will already have been merged with the parent definition
	 * in case of a child definition.
	 * <p>All bean retrieval methods delegate to this method for actual bean creation.
	 *
	 * @param beanName the name of the bean
	 * @param mbd      the merged bean definition for the bean
	 * @param args     explicit arguments to use for constructor or factory method invocation
	 * @return a new instance of the bean
	 * @throws BeanCreationException if the bean could not be created
	 */
	protected abstract Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
			throws BeanCreationException;
此方法在AbstractBeanFactory是一个protected类型的方法、方法签名表明该方法是用于创建bean实例的方法、调用该方法的时候所有的bean定义已经准备好、如果是子类的bean定义已经完全和父bean定义合并。所有的获取bean实例的方法都会委托给此方法去做真正的创建工作。
  1. AbstractAutowireCapableBeanFactory--->doCreateBean
//这里的beanName就是我们在xml中定义的bean定义名称。mbd是已经合并(如果是子类需要和父类合并属性)的bean定义对象。args表示如果是构造器注入需要传入的参数。
@Override
	protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
			throws BeanCreationException {
		RootBeanDefinition mbdToUse = mbd;
=================================(参考2.1)==============================
     // Make sure bean class is actually resolved at this point, and
		// clone the bean definition in case of a dynamically resolved Class
		// which cannot be stored in the shared merged bean definition.
		// 解析 bean 的类型  此处使用来解析bean的类型。因为RootBeanDefinition保存的只是bean的定义信息、
    // bean的定义信息中只是包含了	bean的名称、但是还没有利用反射解析出Bean的真正Class引用、故resolveBeanClass利用反射解析出
    //bean的Class<?>信息存入到RootBeanDefinition的beanClass属性当中去。
		Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
		if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
			mbdToUse = new RootBeanDefinition(mbd);
			mbdToUse.setBeanClass(resolvedClass);
		}

=================================(参考2.2)==============================
       // Prepare method overrides.
			// 处理 lookup-method 和 replace-method 配置,Spring 将这两个配置统称为 override method
			mbdToUse.prepareMethodOverrides();		

=================================(参考2.3)==============================
		// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
		// 在 bean 初始化前应用后置处理,如果后置处理返回的 bean 不为空,则直接返回
		Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
		if (bean != null) {
			return bean;
		}
		
=================================(参考2.4)===============================
		// 调用 doCreateBean 创建 bean
   Object beanInstance = doCreateBean(beanName, mbdToUse, args);   
   return beanInstance;
}

2.1. doCreateBean过程

2.2. doCreateBean过程

2.3. doCreateBean过程

2.4. doCreateBean过程

protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
			throws BeanCreationException {

		// Instantiate the bean.
		/*
		 * BeanWrapper 是一个基础接口,由接口名可看出这个接口的实现类用于包裹 bean 实例。
		 * 通过 BeanWrapper 的实现类可以方便的设置/获取 bean 实例的属性
		 */
		BeanWrapper instanceWrapper = null;
		if (mbd.isSingleton()) {
			// 从缓存中获取 BeanWrapper,并清理相关记录
			instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
		}
		if (instanceWrapper == null) {
			/*
			 * 创建 bean 实例,并将实例包裹在 BeanWrapper 实现类对象中返回。createBeanInstance
			 * 中包含三种创建 bean 实例的方式:
			 *   1. 通过工厂方法创建 bean 实例
			 *   2. 通过构造方法自动注入(autowire by constructor)的方式创建 bean 实例
			 *   3. 通过无参构造方法方法创建 bean 实例
			 *
			 * 若 bean 的配置信息中配置了 lookup-method 和 replace-method,则会使用 CGLIB
			 * 增强 bean 实例。关于这个方法,后面会专门写一篇文章介绍,这里先说这么多。
			 */
			instanceWrapper = createBeanInstance(beanName, mbd, args);
		}
		// 此处的 bean 可以认为是一个原始的 bean 实例,暂未填充属性
		final Object bean = instanceWrapper.getWrappedInstance();
		Class<?> beanType = instanceWrapper.getWrappedClass();
		if (beanType != NullBean.class) {
			mbd.resolvedTargetType = beanType;
		}

		// Allow post-processors to modify the merged bean definition.
		// 这里又遇到后置处理了,此处的后置处理是用于处理已“合并的 BeanDefinition”。
		synchronized (mbd.postProcessingLock) {
			if (!mbd.postProcessed) {

				applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
				mbd.postProcessed = true;
			}
		}

		// Eagerly cache singletons to be able to resolve circular references
		// even when triggered by lifecycle interfaces like BeanFactoryAware.
		/*
		 * earlySingletonExposure 是一个重要的变量,这里要说明一下。该变量用于表示是否提前暴露
		 * 单例 bean,用于解决循环依赖。earlySingletonExposure 由三个条件综合而成,如下:
		 *   条件1:mbd.isSingleton() - 表示 bean 是否是单例类型
		 *   条件2:allowCircularReferences - 是否允许循环依赖
		 *   条件3:isSingletonCurrentlyInCreation(beanName) - 当前 bean 是否处于创建的状态中
		 *
		 * earlySingletonExposure = 条件1 && 条件2 && 条件3
		 *                        = 单例 && 是否允许循环依赖 && 是否存于创建状态中。
		 */
		boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
				isSingletonCurrentlyInCreation(beanName));
		if (earlySingletonExposure) {
			if (logger.isTraceEnabled()) {
				logger.trace("Eagerly caching bean '" + beanName +
						"' to allow for resolving potential circular references");
			}
			// 添加工厂对象到 singletonFactories 缓存中
			addSingletonFactory(beanName, () ->
					// 获取早期 bean 的引用,如果 bean 中的方法被 AOP 切点所匹配到,此时 AOP 相关逻辑会介入
					getEarlyBeanReference(beanName, mbd, bean));
		}

		// Initialize the bean instance.
		Object exposedObject = bean;

			// 向 bean 实例中填充属性,populateBean 所谓的属性注入都是发生在这个方法里面、详细解析
			populateBean(beanName, mbd, instanceWrapper);
			/*
			 * 进行余下的初始化工作,详细如下:
			 * 1. 判断 bean 是否实现了 BeanNameAware、BeanFactoryAware、
			 *    BeanClassLoaderAware 等接口,并执行接口方法
			 * 2. 应用 bean 初始化前置操作
			 * 3. 如果 bean 实现了 InitializingBean 接口,则执行 afterPropertiesSet
			 *    方法。如果用户配置了 init-method,则调用相关方法执行自定义初始化逻辑
			 * 4. 应用 bean 初始化后置操作
			 *
			 * 另外,AOP 相关逻辑也会在该方法中织入切面逻辑,此时的 exposedObject 就变成了
			 * 一个代理对象了
			 */
			exposedObject = initializeBean(beanName, exposedObject, mbd);

		if (earlySingletonExposure) {
			Object earlySingletonReference = getSingleton(beanName, false);
			if (earlySingletonReference != null) {
				// 若 initializeBean 方法未改变 exposedObject 的引用,则此处的条件为 true。
				if (exposedObject == bean) {
					exposedObject = earlySingletonReference;
				} else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) {
					String[] dependentBeans = getDependentBeans(beanName);
					Set<String> actualDependentBeans = new LinkedHashSet<>(dependentBeans.length);
					for (String dependentBean : dependentBeans) {
						if (!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) {
							actualDependentBeans.add(dependentBean);
						}
					}
				}
			}
		}

		// Register bean as disposable.
			// 注册销毁逻辑
      registerDisposableBeanIfNecessary(beanName, bean, mbd);
		return exposedObject;
	}