学习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会先检查单例池中是否有此对象,有则返回,无则继续执行创建对象流程。
开始创建Bean对象
进入getSingleton方法,调用lamda表达式进入createBean(beanName,mbd,args)。
在createBean(beanName,mbd,args)中先会调用BeanPostProcessors(Bean的后置处理器)判断是否返回代理对象。
不返回代理对象,则进入doCreateBean(beanName,mbdToUser,args)调用createBeanInstance(beanName,mbd,args)方法。
进入instantiateBean(beanName,mbd)通过策略模式选择对象创建方法,jdk的反射/Cglib。
进入getInstantiationStrategy().instantiate(mbd, beanName, this)。
最后调用BeanUtils.instantiateClass(constructorToUse)通过反射完成对象创建。
以上步骤创建完对象,但未赋值。
-
DI流程
创建完对象回到主流程,进入populateBean(beanName,mbd,instanceWrapper)准备给属性赋值。
进入方法首先判断,是否使用InstantiationAwareBeanPostProcessor后置处理器干预
根据不同的方式注入属性值(通过反射赋值)
回到主流程进入initializeBean(beanName,exposedObject,mbd)初始化Bean对象。
BeanPostProcessor和InitializingBean后置处理器会干预已经完成的Bean对象。
返回最终的Bean对象。