创建Bean的过程
前面几乎都是与初始化相关的内容,现在看看创建bean的过程是什么样的。从前文可知,ApplicationContext是BeanFactory的增强,ApplicationContext中对BeanFactory做拦截扩展等处理,我们先从ApplicationContext在初始化时的创建单例bean入手。
打开AbstractRefreshableApplicationContext类的refresh中有初始化单例bean的方法finishBeanFactoryInitialization调用,从代码中进去,可以看到调用了beanFactory.preInstantiateSingletons,这是初始化的入口, 其中包含初始化单例bean的逻辑,在DefaultListableBeanFactory类中,有preInstantiateSingletons方法的实现:
可以看到,针对单例bean,会调用getBean方法创建单例对象,这与我们手动获取bean的方式是一样的,从中可以看到doCreateBean的调用,以及在doCreateBean方法中对populateBean方法的调用,其中populateBean则是处理Bean的属性信息和依赖的对象,以及对InstantiationAwareBeanPostProcessor的调用。
Bean的初始化遵循的主流程是比较简单的,即创建实例->注入依赖的对象(如果依赖的对象没有初始化则创建并初始化,递归的过程)-> 初始化bean这样的过程,此过程可以从doCreateBean方法中看到具体的代码实现。
先看看创建bean,通过调用createBeanInstance得到一个BeanWrapper对象,对于createBeanInstance方法,其中会处理factory-method和构造器注入:
由此可看到MergedBeanDefinitionPostProcessor是在处理属性之前调用,那么此接口可用于在依赖注入之前对bean的依赖做处理,依赖前文中提到的注解注入的实现类AutowiredAnnotationBeanPostProcessor
在创建bean的实例对象后,会调用populateBean方法对bean的属性做处理,会涉及到InstantiationAwareBeanPostProcessor接口的调用:在populateBean方法里,spring对创建出来的bean的实例做依赖的注入:
最后则是初始化bean,在populateBean之后会调用initializeBean方法对bean做初始化,在bean的初始化之前和bean初始化之后,BeanPostProcessor接口会被使用到: