Spring注解配置分析(七)——对象实例化和初始化

  通过前面的分析已经知道如何将我们配置的一些类加载到容器中,但是到目前位置,只是分析了如何发现这些配置并转化为 BeanDenifition 保存在 BeanFactory 中。下面将会分析,将 BeanDenifition 转化为 bean 对象的流程。

  1. AbstractApplicationContext 的 refresh 方法,会调用 finishBeanFactoryInitialization 方法实例化所有非懒加载的单例对象。
  2. finishBeanFactoryInitialization 方法完成 BeanFactory 的配置之后调用 DefaultListableFactory 的 preInstantiateSingletons 方法完成非懒加载单例的初始化,以及完成 FactoryBean 中 bean 的初始化
  3. preInstantiateSingletons 方法中初始需要提前初始化的 FactoryBean 和 其他bean,最终会调用 AbstractBeanFactory 的 doGetBean 方法
  4. doGetBean 方法中包含很多操作,如判断是否已经初始化过,调用父容器初始化,初始化依赖bean等。现在只考虑实例化单例bean,那么接下来会先调用 createBean 方法。
  5. createBean 方法中要注意的是 resolveBeforeInstantiation 操作,它在对象实例化之前,会调用 InstantiationAwareBeanPostProcessor 的 postProcessBeforeInstantiation 方法,在对象实例化之前生成自定义的类,这里可以用来生成一种代理类。然后会调用 doCreateBean 方法。
  6. doCreateBean 方法是真正完成对象实例化的方法,流程如下
    1. 调用 createBeanInstance 初始化对象
    2. 调用 applyMergedBeanDefinitionPostProcessors, 这个方法会调用 MergedBeanDefinitionPostProcessor 实现的接口, AutowiredAnnotationBeanPostProcessor 作为其中一个实现类,它找到对象被 @Autowired、 @Value 以及 @Inject 注解字段和方法并保存,之后需要利用这些信息完成自动注入。CommonAnnotationBeanPostProcessor 会找到对象中的 @PostConstruct , @PreDestroy 注解,然后之后执行相关的操作。
    3. 调用 populateBean 方法,该方法会调用 InstantiationAwareBeanPostProcessor 的 postProcessAfterInstantiation 以及 postProcessPropertyValues, AutowiredAnnotationBeanPostProcessor 作为实现类,它会为对象设置 @Autowired 的属性 方法为对象设置属性。到这里对象已经实例化完成了,后面会调用 initializeBean 方法完成初始化。
    4. 调用 initializeBean 方法,完成对象初始化相关操作,流程如下:
      1. 调用 BeanPostProcessor 的 postProcessBeforeInitialization 方法, CommonAnnotationBeanPostProcessor 正是在这个阶段调用 @PostConstruct 注解的 init 方法。
      2. 执行对象的初始方法(这是Spring中的含义,不同于java中的初始化),例如对象实现了 InitializingBean 接口,或者在通过 xml 配置了初始化方法
      3. 调用 BeanPostProcessor 的 postProcessAfterInitialization 方法。

  以上包含了对象实例化和初始化的大致过程,需要注意的地方就是实例化和初始化前后都要调用对应的 BeanPostProcessor ,例如 AutowiredAnnotationBeanPostProcessor 完成了自动注入, CommonAnnotationBeanPostProcessor 完成了生命周期相关的操作。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值