Spring框架学习-IOC(getBean流程)

 2023-02-16
原文作者:LXPWing 原文地址:https://juejin.cn/post/7014674154095902757

学习spring框架的心得与总结。附:spring源码注释地址github.com/LXPWing/spr…

getBean流程图:www.processon.com/view/link/6…

Bean的生命周期流程图:www.processon.com/view/link/6…

DI流程图:www.processon.com/view/link/6…

getBean流程

getBean流程中spring会 先检查单例池 中是否有此对象,有则返回,无则继续执行创建对象流程。

202301012122223641.png

开始创建Bean对象

202301012122231352.png

进入getSingleton方法,调用lamda表达式进入createBean(beanName,mbd,args)。

202301012122239103.png

在createBean(beanName,mbd,args)中先会调用BeanPostProcessors(Bean的后置处理器) 判断是否返回代理对象

202301012122248054.png

不返回代理对象,则进入doCreateBean(beanName,mbdToUser,args)调用createBeanInstance(beanName,mbd,args)方法。

202301012122254055.png

进入instantiateBean(beanName,mbd)通过策略模式选择对象创建方法,jdk的反射/Cglib。

202301012122261226.png

进入getInstantiationStrategy().instantiate(mbd, beanName, this)。

202301012122269417.png

最后调用BeanUtils.instantiateClass(constructorToUse) 通过反射完成对象创建

202301012122276588.png

以上步骤创建完对象,但未赋值

  • DI流程

创建完对象回到主流程, 进入populateBean(beanName,mbd,instanceWrapper)准备给属性赋值

202301012122284839.png

进入方法首先判断,是否使用InstantiationAwareBeanPostProcessor后置处理器干预

2023010121222918410.png

根据不同的方式注入属性值(通过反射赋值)

2023010121222994211.png

回到主流程进入initializeBean(beanName,exposedObject,mbd) 初始化Bean对象

2023010121223071212.png

BeanPostProcessor和InitializingBean后置处理器会干预已经完成的Bean对象

2023010121223130113.png

返回最终的Bean对象