Spring Bean 在容器的生命周期是什么样的?

时间:2022-02-28 20:17:06

Spring Bean 的初始化流程如下:

  • 实例化 Bean 对象

    • Spring 容器根据配置中的 Bean Definition(定义)中实例化 Bean 对象。

      Bean Definition 可以通过 XML,Java 注解或 Java Config 代码提供。

    • Spring 使用依赖注入填充所有属性,如 Bean 中所定义的配置。

  • Aware 相关的属性,注入到 Bean 对象
    • 如果 Bean 实现 BeanNameAware 接口,则工厂通过传递 Bean 的 beanName 来调用 #setBeanName(String name) 方法。
    • 如果 Bean 实现 BeanFactoryAware 接口,工厂通过传递自身的实例来调用 #setBeanFactory(BeanFactory beanFactory) 方法。
  • 调用相应的方法,进一步初始化 Bean 对象
    • 如果存在与 Bean 关联的任何 BeanPostProcessor 们,则调用 #preProcessBeforeInitialization(Object bean, String beanName) 方法。
    • 如果 Bean 实现 InitializingBean 接口,则会调用 #afterPropertiesSet() 方法。
    • 如果为 Bean 指定了 init 方法(例如 <bean /> 的 init-method 属性),那么将调用该方法。
    • 如果存在与 Bean 关联的任何 BeanPostProcessor 们,则将调用 #postProcessAfterInitialization(Object bean, String beanName) 方法。

Spring Bean 的销毁流程如下:

  • 如果 Bean 实现 DisposableBean 接口,当 spring 容器关闭时,会调用 #destroy() 方法。
  • 如果为 bean 指定了 destroy 方法(例如 <bean /> 的 destroy-method 属性),那么将调用该方法。

整体如下图:

Spring Bean 在容器的生命周期是什么样的?

Spring实现Aware接口  https://www.jianshu.com/p/7ce88398cf78

InitializingBean的作用  https://blog.csdn.net/maclaren001/article/details/37039749

Spring 的 BeanPostProcessor 原理剖析及使用  https://www.jianshu.com/p/58d2bddcb871

写代码简单比较init-method,afterPropertiesSet和BeanPostProcessor  https://www.2cto.com/kf/201310/251778.html