Spring容器创建过程——创建Bean

Bean的创建

11、refresh()方法调用finishBeanFactoryInitialization()方法,初始化剩下的所有单实例bean
在这里插入图片描述

finishBeanFactoryInitialization()方法调用preInstantiateSingletons()方法实例化剩下的所有单实例bean
在这里插入图片描述
首先获取到所有定义的bean,然后依次进行创建和初始化对象
在这里插入图片描述
然后遍历所有的bean,获取bean的定义信息
在这里插入图片描述
接着会判断当前bean是否不是抽象的,且是否是单实例,而且是否是懒加载的
在这里插入图片描述
如果是,则进一步判断当前bean是否是FactoryBean,即判断是否实现了FactoryBean接口的bean
,如果是工厂bean,就会调用接口中getObject()方法来创建对象
在这里插入图片描述

如果不是工厂bean就会调用getBean()方法来创建对象
在这里插入图片描述

getBean()方法进一步调用doGetBean()方法
在这里插入图片描述
拿到bean的名字之后,先调用getSingleton()方法获取缓存中的单实例bean,如果能获取到,就说明这个bean之前已经被创建过了,因为所有创建过的单实例bean都会被缓存起来
在这里插入图片描述
如果缓存中获取不到,就开始bean的创建对象流程

首先标记当前bean已被创建,防止多线程创建同一个bean
在这里插入图片描述
然后获取bean定义信息
在这里插入图片描述
接着获取当前bean依赖的其它bean,如果有依赖就会调用getBean()方法把依赖的bean先创建出来
在这里插入图片描述
如果当前bean单实例bean就会启动单实例bean创建流程,会调用getSingleton()方法通过工厂的getObject()方法调用createBean()来创建bean
在这里插入图片描述
createBean()会先获取bean的定义信息
在这里插入图片描述
然后解析bean的类型
在这里插入图片描述
createBean()会调用resolveBeforeInstantiation()方法,在实例化之前,让BeanPostProcessor先拦截返回代理对象。
在这里插入图片描述
正常的BeanPostProcessor都是在对象创建完后,初始化前后来进行拦截,而这里的后置处理器是InstantiationAwareBeanPostProcessor类型,在创建对象之前就会进行拦截。如果是InstantiationAwareBeanPostProcessor类型就会调用applyBeanPostProcessorsBeforeInstantiation()方法
在这里插入图片描述
applyBeanPostProcessorsBeforeInstantiation()方法会触发postProcessBeforeInstantiation()方法,后置处理器会在创建对象前进行拦截
在这里插入图片描述
如果有返回值,就会调用applyBeanPostProcessorsAfterInitialization()方法
在这里插入图片描述
applyBeanPostProcessorsAfterInitialization()方法会触发postProcessAfterInitialization()方法,在创建对象之后执行拦截处理
在这里插入图片描述

如果前面的resolveBeforeInstantiation()方法没有返回一个代理对象,就会调用doCreateBean()方法返回一个Bean实例

在这里插入图片描述
doCreateBean()会调用createBeanInstance()方法创建一个bean实例
在这里插入图片描述
createBeanInstance()方法利用工厂方法或者对象的构造器创建出bean实例
在这里插入图片描述
doCreateBean()方法在调用createBeanInstance()方法创建出bean对象之后,可以调用applyMergedBeanDefinitionPostProcessors()方法允许后置处理器修改一些bean的定义

在这里插入图片描述
applyMergedBeanDefinitionPostProcessors()方法遍历所有的后置处理器,如果是MergedBeanDefinitionPostProcessor类型的,就会调用postProcessMergedBeanDefinition()方法
在这里插入图片描述
doCreateBean()方法完成bean的创建之后,会调用populateBean()为创建出来的bean进行属性赋值
在这里插入图片描述
在赋值之前,会先获取InstantiationAwareBeanPostProcessor后置处理器,执行这个类型后置处理器的postProcessAfterInstantiation()方法,在实例化之后初始化之前进行拦截处理
在这里插入图片描述
然后,继续获取InstantiationAwareBeanPostProcessor后置处理器,执行这个类型后置处理器的postProcessPropertyValues()方法,返回bean的属性值
在这里插入图片描述
最后才调用applyPropertyValues()方法应用返回的bean的属性值,利用反射调用setter方法进行属性赋值。此时完成属性的赋值工作
在这里插入图片描述

完成属性赋值之后,会调用initializeBean()方法来初始化bean
在这里插入图片描述
initializeBean()方法会调用invokeAwareMethods()方法,执行实现各种Aware接口的方法
在这里插入图片描述
然后调用applyBeanPostProcessorsBeforeInitialization()方法,让后置处理器在bean初始化之前进行拦截
在这里插入图片描述
applyBeanPostProcessorsBeforeInitialization()方法会遍历所有的后置处理器,执行每个后置处理器的postProcessBeforeInitialization()方法
在这里插入图片描述
初始化之前的后置处理器执行完之后,就会调用invokeInitMethods()方法,执行初始化方法
在这里插入图片描述
invokeInitMethods()方法执行bean的初始化操作
在这里插入图片描述
初始化结束之后,会调用applyBeanPostProcessorsAfterInitialization()方法,执行初始化之后的后置处理器操作
在这里插入图片描述
applyBeanPostProcessorsAfterInitialization()方法遍历所有的后置处理器,执行postProcessAfterInitialization()方法在这里插入图片描述
至此bean的初始化完成

初始化执行完成之后,会调用registerDisposableBeanIfNecessary()方法注册bean的销毁方法
在这里插入图片描述
至此doCreateBean()方法执行结束,返回一个bean实例

所有Bean都利用getBean()方法创建完成以后,会检查所有的Bean是否实现了SmartInitializingSingleton接口,如果是就执行afterSingletonsInstantiated()方法
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值