springboot实例化过程

实例化过程,就是把从xml或注解解析得到的BeanDefinition通过反射获取到bean的过程,该过程入口就是refresh方法。完整流程如下:

AbstractApplicationContext类:refresh()->finishBeanFactoryInitialization()-> ConfigurableBeanFactory接口:preInstantiateSingletons()->DefaultListableBeanFactory类->preInstantiateSingletons()->第三层while的this.getBean(beanName)->AbstractBeanFactory类-getBean()->doGetBean()->createBean()方法->doCreateBean()->createBeanInstance()->instantiateBean()->SimpleInstantiationStrategy类->BeanUtil.instantiateClass()

下面来看看springboot是如何进行这一过程

首先看refresh方法,

AbstractApplicationContext

refresh()->finishBeanFactoryInitialization()-> preInstantiateSingletons()

 ConfigurableBeanFactory接口->preInstantiateSingletons()方法,对应实现类DefaultListableBeanFactory

DefaultListableBeanFactory类->preInstantiateSingletons()方法

 preInstantiateSingletons()方法有多层while和do while的循环操作,一层层过滤

最终执行第三层while的this.getBean(beanName)方法

 

 AbstractBeanFactory类:getBean()->this.doGetBean()->this.createBean()->

 AbstractAutowireCapableBeanFactory类:createBean(),该方法出现RooBeanDefinition,

 继续来看doCreateBean(),do开头是实际干活的方法。

扩展:在doCreateBean()方法关键对象:BeanWrapper,它是一个接口,封装了反射方法,通过反射得到的对象传给BeanWrapper对象,可以很轻松对反射出来的对象进行赋值操作,BeanWrapper是为后面初始化对象而创建,在日常开发中,运用到反射赋值操作,也可以接用该对象方便赋值

 在 doCreateBean()方法再调用createBeanInstance()方法->instantiateBean()方法

 在SimpleInstantiationStrategy类调用BeanUtil工具类的instantiateClass方法进行实例化对象(ctor.newInstance())

实例化后就会进行初始化,调用populateBean(beanName,mbd,instanceWrapper)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值