Spring-单例bean创建过程小结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/andy_zhang2007/article/details/86499574

缺省情况下,一个Spring bean是单例模式的,也就是说,在整个Spring容器中,该bean只有一个。并且一个单例bean会在第一次从容器获取时被创建,随后再次从容器获取时返回的其实是已经创建好的实例。Spring创建bean的过程,并不是简单地使用Java new关键字创建一个POJO对象,相反,除了创建POJO对象之外,Spring还会对所创建的bean对象进行必要的代理包装,执行生命周期回调方法,设置属性,进行依赖注入等等。尤其是这里依赖注入的执行,这是Spring框架赖以成功的核心概念。
这篇文章总结一下单例bean的创建过程,以备开发人员参考:

  1. 根据bean名称获取MergedBeanDefinition
  2. 获取所依赖的bean的名称并确保这些bean被创建

    也就是类似注解@DependsOn所指定的bean,这里所谓"确保这些bean被创建"其实是递归调用容器获取这些bean从而触发它们的创建过程

  3. 获取创建bean所要时使用的实现类
  4. InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation

    在这一步有可能直接返回另外一个对象代替该bean执行具体功能。

  5. 实例化bean对象

    可以认为相当于使用Java new关键字创建一个对象,实际上可能是通过反射,或者调用工厂方法

  6. MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition
  7. populateBean
    1. InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation
    2. InstantiationAwareBeanPostProcessor#postProcessProperties

      @Autowired/@Inject/@Value依赖注入就是在这里完成的,具体来讲,是通过o.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor

    3. 应用BeanDefinition中的属性

      bean的创建来自bean定义,也就是BeanDefinition,BeanDefinition也以对象形式存在,通常由框架提供,其中也会有需要填充到最终bean的属性,这一步骤应用的就是这些属性

  8. initializeBean 初始化bean
    1. invokeAwareMethods 调用各种Aware接口定义的方法
    2. BeanPostProcessor#postProcessBeforeInitialization
    3. invokeInitMethods 调用初始化方法(可能有多个)
      1. InitializingBean#afterPropertiesSet
      2. 定义中指定的自定义初始化方法

        如果和InitializingBean#afterPropertiesSet同名则不会被调用

    4. BeanPostProcessor#postProcessAfterInitialization
  9. registerDisposableBeanIfNecessary

猜你喜欢

转载自blog.csdn.net/andy_zhang2007/article/details/86499574