Bean的创建过程

作者: 无醉_1866 | 来源:发表于2019-10-04 21:14 被阅读0次

    创建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接口会被使用到:

    相关文章

      网友评论

        本文标题:Bean的创建过程

        本文链接:https://www.haomeiwen.com/subject/blispctx.html