学习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对象 。