Spring源码(二)

bean的加载

beanFactory.getBean("beanName");

实例化

(1)beanName转换:因为传入的beanName可能是beanName,也可能是别名,也可能是factoryBean,因此需要根据别名或者factoryBean获取到真实的beanName.
在这里插入图片描述
(2)调用getSingleton()获取单例bean:首先检查单例缓存(singletonObjects)中是否存在,存在则返回;否则检查是否正在创建(singletonsCurrentlyInCreation)获取对应的ObjectFactory调用getObject获取,否则返回null;
注:默认情况下参数allowEarlyReference为true,表示允许bean未创建完成时提前依赖。
Spring源码(二)_第1张图片

(3)原型模式的依赖检查。
在这里插入图片描述
(4)获取ParentBeanFactory,如果存在则通过它获取bean,否则继续执行:
注:在bean标签中配置了parent属性,且parent bean配置了factory-bean时才会获取到,否则都是null.
Spring源码(二)_第2张图片
(5)标记为已创建,添加入alreadyCreated中:
Spring源码(二)_第3张图片
(6)将beanDefinition转换为RootBeanDefinition,添加入mergedBeanDefinitions,并检查是否抽象;
在这里插入图片描述
(7)递归加载注册依赖的bean(如果存在):
Spring源码(二)_第4张图片
(8)根据scope执行不同的bean创建过程(此处仅追踪singleton类型):调用getSingleton()获取单例bean,在第二个参数中回调了createBean()函数,以下进入getSingleton()函数:
Spring源码(二)_第5张图片
(9)检查缓存(singletonObjects)中是否存在,存在则返回,否则执行单例bean创建前执行的方法:
Spring源码(二)_第6张图片
该方法中做了两件事:

  • 检查是否在创建检查的白名单中;
  • 加入singletonsCurrentlyInCreation中,表明当前bean处于创建中。

在这里插入图片描述
(10)调用ObjectFactory中的getObject(),即回调AbstractBeanFactorycreateBean()方法,以下分析进入回调方法createBean()函数:

	singletonObject = singletonFactory.getObject();

(11)解析bean对应的class:
在这里插入图片描述
(12)由RootBeanDefinition获取需要重写的方法;
(13)执行bean实例化前的解析操作resolveBeforeInstantiation,解析bean关联的InstantiationAwareBeanPostProcessor,调用其postProcessBeforeInstantiation()以及postProcessAfterInitialization函数:
Spring源码(二)_第7张图片
(14)在此之前的操作都是一些bean实例化前的准备操作,接下来调用doCreateBean函数,开始真正的创建:

beanInstance = this.doCreateBean(beanName, mbdToUse, args);

(15)调用createBeanInstance()解析beanClass

  • 首先判断是否存在factory-method,存在则执行对应的工厂方法;
  • 否则执行determineConstructorsFromBeanPostProcessors,判断是否有与bean相关联的InstantiationAwareBeanPostProcessor,如果存在且是SmartInstantiationAwareBeanPostProcessor接口的实例,则获取对应的构造器.
  • 如果满足上一步中获取到的构造器为空,并且RootBeanDefinition中的autowireMode不为3、构造参数为空这几个条件,则调用instantiateBean函数执行bean的实例化;否则调用autowireConstructor函数执行实例化。
  • 两个参数内部均为通过反射获取构造器,前者适用于无参构造函数,后者适用于存在有参构造函数,因为有参构造函数可能重载,因此需要遍历所有构造器,根据RootBeanDefinition中的构造参数列表获取对应的构造器,通过反射创建bean实例。
    Spring源码(二)_第8张图片

(16)解析bean关联的BeanPostProcessors,调用其postProcessMergedBeanDefinition函数:
Spring源码(二)_第9张图片
(17)判断beanName是否单例、是否允许循环引用、是否处于正在创建的过程中(singletonsCurrentlyInCreation),如果都满足创建beanName对应的ObjectFactory加入singletonFactories中,并将beanName加入registeredSingletons
Spring源码(二)_第10张图片
Spring源码(二)_第11张图片

属性赋值

(18)此时的bean已经实例化完成,但所有属性值都为空,接下来执行populateBean方法,调用applyPropertyValues()为bean设置属性,具体代码就是根据RootbeanDefinition进行解析,为bean属性依次赋值;

初始化

(19)执行bean的初始化:

  • 获取所有与bean关联的beanProcessor并依次调用postProcessBeforeInitialization(result, beanName)
  • 如果bean实现了InitializingBean接口,则调用其afterPropertiesSet
  • 调用自定义的init-method方法(如果存在);
  • 获取所有与bean关联的beanProcessor并依次调用postProcessAfterInitialization(result, beanName)
    Spring源码(二)_第12张图片
    (20)至此beanInstance创建完成,将其加入singletonObjectsregisteredSingletons中,并从singletonFactoriesearlySingletonObjects中移出:
    Spring源码(二)_第13张图片
    (21)如果bean实现了DisposableBean接口,则将bean加入disposableBeans
    Spring源码(二)_第14张图片
    (22)执行afterSingletonCreation清理缓存:
    在这里插入图片描述
    (23)从beanInstance中获取对象时,如果BeanInstance是FactoryBean实例的引用,则解析调用返回其getObject()方法的返回值;否则直接返回BeanInstance对象;并将获取到的Object加入缓存singletonObjects
    Spring源码(二)_第15张图片

你可能感兴趣的:(Spring)