bean的实例化过程源码解析
建议用IDEA的debug模式来观察Spring的IOC过程
进入到此类的构造方法中
查看setConfigLocations,就是将配置文件加载到configLocations里去
向下执行,查看refresh()
this.prepareRefresh(): 此方法是准备工作,大家感兴趣可以点进去看一下,可以看到里面是获取时间,获取环境信息的一些设置。
this.obtainFreshBeanFactory(): 这一步是创建beanFactory,并且读取Bean的信息,源码注释中还有写到
// Tell the subclass to refresh the internal bean factory.会告诉子类去刷新内部bean工厂
this.refreshBeanFactory:
* This implementation performs an actual refresh of this context's underlying
* bean factory, shutting down the previous bean factory (if any) and
* initializing a fresh bean factory for the next phase of the context's lifecycle.
这个实现类的方法会刷新容器中的beanFactory,关闭之前存在的并且初始化新的beanFactory
利用this.createBeanFactory() 创建了一个beanFactory,类型为DefaultListableBeanFactory
这个类接着往下走:this.loadBeanDefinitions(beanFactory);
* Load bean definitions into the given bean factory, typically through
* delegating to one or more bean definition readers.
这个方法会将beandefinitionsReader读取到的bean definitions放入bean工厂,我们以上提出的三种
注入方式都会走到这里,将bean信息丢进去
返回上述 refresh()
this.prepareBeanFactory(beanFactory); 设置和忽略一些对象值
this.postProcessBeanFactory(beanFactory); 空方法可自定义扩展
this.invokeBeanFactoryPostProcessors(beanFactory);
* Instantiate and invoke all registered BeanFactoryPostProcessor beans,
* respecting explicit order if given.
* <p>Must be called before singleton instantiation.
实例化所有beanFactory组件
registerBeanPostProcessors(beanFactory);
Instantiate and register all BeanPostProcessor beans, //先注册再调用
initApplicationEventMulticaster(); 观察者模式监听器, 监听组件的相关状态,并决定相关调用方法。
finishBeanFactoryInitialization(beanFactory); 重要!!
beanFactory.preInstantiateSingletons(); 实例化方法
此方法最后this.getBean(beanName)
继续
Return an instance, which may be shared or independent, of the specified bean.
注释已经很清楚了,此方法会返回一个实例,就是我们的bean对象
进入到createBean方法中
继续进入!
Instantiate the given bean using its default constructor.
这个方法注释说明了实例化对象是用构造器完成的
继续看他如何构造的
ca 就是Constructor,从这里我们基本可以看出容器内,bean对象的实例化
是利用反射的基本原理,获取类构造器,然后newInstance来实现的
以上就是bean对象实例化的基本过程,下面是实例化完成后的初始化过程
回到这里,实例化完成后
注释说明了在populateBean完成bean的初始化
继续
会看到在此方法里会调用前置和后置处理器来初始化Bean
以上就完成了bean的实例化过程,文章开头的那个图刚开始有点懵,但是一旦跑完一遍bean的实例化过程,再次结合图,就清晰了很多。本文只是简单的跟随debug顺序,完整的走了一遍bean实例化的过程。