Spring源码(二)

bean的加载

beanFactory.getBean("beanName");

实例化

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

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

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

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

	singletonObject = singletonFactory.getObject();

(11)解析bean对应的class:
在这里插入图片描述
(12)由RootBeanDefinition获取需要重写的方法;
(13)执行bean实例化前的解析操作resolveBeforeInstantiation,解析bean关联的InstantiationAwareBeanPostProcessor,调用其postProcessBeforeInstantiation()以及postProcessAfterInitialization函数:
在这里插入图片描述
(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实例。
    在这里插入图片描述

(16)解析bean关联的BeanPostProcessors,调用其postProcessMergedBeanDefinition函数:
在这里插入图片描述
(17)判断beanName是否单例、是否允许循环引用、是否处于正在创建的过程中(singletonsCurrentlyInCreation),如果都满足创建beanName对应的ObjectFactory加入singletonFactories中,并将beanName加入registeredSingletons
在这里插入图片描述
在这里插入图片描述

属性赋值

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

初始化

(19)执行bean的初始化:

  • 获取所有与bean关联的beanProcessor并依次调用postProcessBeforeInitialization(result, beanName)
  • 如果bean实现了InitializingBean接口,则调用其afterPropertiesSet
  • 调用自定义的init-method方法(如果存在);
  • 获取所有与bean关联的beanProcessor并依次调用postProcessAfterInitialization(result, beanName)
    在这里插入图片描述
    (20)至此beanInstance创建完成,将其加入singletonObjectsregisteredSingletons中,并从singletonFactoriesearlySingletonObjects中移出:
    在这里插入图片描述
    (21)如果bean实现了DisposableBean接口,则将bean加入disposableBeans
    在这里插入图片描述
    (22)执行afterSingletonCreation清理缓存:
    在这里插入图片描述
    (23)从beanInstance中获取对象时,如果BeanInstance是FactoryBean实例的引用,则解析调用返回其getObject()方法的返回值;否则直接返回BeanInstance对象;并将获取到的Object加入缓存singletonObjects
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值