Spring-单例bean创建过程小结

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

  1. 根据bean名称获取MergedBeanDefinition

    如果bean定义是一个ChildBeanDefinition或者parentName不为空的GenericBeanDefinition,则需要合并当前bean定义和祖先bean定义生成一个"合并了的"MergedBeanDefinition,然后基于此MergedBeanDefinition进行bean创建。

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

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

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

    在这一步有可能直接返回另外一个对象(比如代理对象)代替该bean完成该bean的各种功能。

  5. 实例化

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

  6. MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition

    可以参考AutowiredAnnotationBeanPostProcessor以助于理解在该生命周期节点可以做些什么事情。

  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
    1. invokeAwareMethods 调用各种Aware接口定义的方法
    2. BeanPostProcessor#postProcessBeforeInitialization
    3. invokeInitMethods 调用初始化方法(可能有多个)
      1. InitializingBean#afterPropertiesSet
      2. 定义中指定的自定义初始化方法

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

    4. BeanPostProcessor#postProcessAfterInitialization
  9. registerDisposableBeanIfNecessary

    如果该bean定义含有销毁回调,则将该bean登记起来,在容器销毁bean阶段执行相应的回调

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值