实例化过程,就是把从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)