原创

Spring源码-bean的生命周期

文章源码:https://github.com/Sniper2016/SpringStudy

一、概述

在传统的 Java 应用中,bean 的生命周期很简单。使用 Java 关键字 new 进行 bean 实例化,然后该 bean 就可以使用了。一旦该 bean 不再被使用,则由 Java 自动进行垃圾回收。

相比之下,Spring 容器中的 bean 的生命周期就显得相对复杂多了。正确理解 Spring bean 的生命周期非常重要,因为你或许要利用 Spring 提供的扩展点来自定义 bean 的创建过程。

下图展示了 bean 装载到 Spring 应用上下文中的一个典型的生命周期过程。

bean生命周期
bean生命周期

二、初始化流程详解

正如你所见,在 bean 准备就绪之前,bean 工厂执行了若干启动步骤。我们对上图进行详细描述:

  1. Spring 对 bean 进行实例化;
  2. Spring 将值和 bean 的引用注入到 bean 对应的属性中;
  3. 如果 bean 实现了 BeanNameAwar接口,Spring 将 bean 的 ID 传递给 setBean-Name()方法;
  4. 如果 bean 实现了 BeanFactoryAware 接口,Spring 将调用 setBeanFactory()方法,将 BeanFactory 容器实例传入;
  5. 如果 bean 实现了 ApplicationContextAware 接口,Spring 将调用 setApplicationContext()方法,将 bean 所在的应用上下文的引用传入进来;
  6. 如果 bean 实现了 BeanPostProcessor 接口,Spring 将调用它们的 post-ProcessBeforeInitialization()方法;
  7. 如果 bean 实现了 InitializingBean 接口,Spring 将调用它们的 afterPropertiesSet()方法。类似地,如果 bean 使用 init-method 声明了初始化方法,该方法也会被调用;
  8. 如果 bean 实现了 BeanPostProcessor 接口,Spring 将调用它们的 post-ProcessAfterInitialization()方法;
  9. 此时,bean 已经准备就绪,可以被应用程序使用了,它们将一直驻留在应用上下文中,直到该应用上下文被销毁;
  10. 如果 bean 实现了 DisposableBean 接口,Spring 将调用它的 destroy()接口方法。同样,如果 bean 使用 destroy-method 声明了销毁方法,该方法也会被调用。
  11. 现在你已经了解了如何创建和加载一个 Spring 容器。但是一个空的容器并没有太大的价值,在你把东西放进去之前,它里面什么都没有。为了从 Spring 的 DI 中受益,我们必须将应用对象装配进 Spring 容器中。

三、总结

  • Spring就是一个bean容器
  • 本文介绍的是单个bean的生命周期流程,而非spring的生命周期
  • 我们可以通过对bean实现上面的接口来干扰bean的初始化,spring的aop特性、dubbo等等使用spring的框架都使用了这一特性干扰bean,进而实现自己想要的效果。
正文到此结束