面试题:说下 Spring Bean 的生命周期?

Spring Bean 的生命周期是指从 Bean 的创建、初始化、使用到销毁的整个过程。Spring 容器负责管理 Bean 的生命周期,并提供了多个扩展点,允许开发者在 Bean 的不同阶段执行自定义逻辑。

以下是 Spring Bean 的完整生命周期:


1. Bean 的生命周期阶段

Spring Bean 的生命周期可以分为以下几个阶段:

(1)实例化(Instantiation)

  • Spring 容器根据配置(如 XML、注解或 Java 配置)创建 Bean 的实例。
  • 如果 Bean 是单例的,Spring 会在容器启动时创建实例;如果是原型的,则每次请求时创建实例。

(2)属性赋值(Populate Properties)

  • Spring 容器将配置的属性值或依赖注入到 Bean 中。
  • 支持通过 Setter 方法、构造函数或字段注入。

(3)BeanNameAware 和 BeanFactoryAware

  • 如果 Bean 实现了 BeanNameAware 接口,Spring 会调用 setBeanName() 方法,将 Bean 的名称传递给它。
  • 如果 Bean 实现了 BeanFactoryAware 接口,Spring 会调用 setBeanFactory() 方法,将 BeanFactory 实例传递给它。

(4)BeanPostProcessor 的前置处理

  • 如果容器中注册了 BeanPostProcessor,Spring 会调用其 postProcessBeforeInitialization() 方法,在 Bean 初始化之前执行自定义逻辑。

(5)初始化(Initialization)

  • 如果 Bean 实现了 InitializingBean 接口,Spring 会调用 afterPropertiesSet() 方法。
  • 如果 Bean 配置了自定义的初始化方法(如 init-method),Spring 会调用该方法。

(6)BeanPostProcessor 的后置处理

  • 如果容器中注册了 BeanPostProcessor,Spring 会调用其 postProcessAfterInitialization() 方法,在 Bean 初始化之后执行自定义逻辑。

(7)使用(In Use)

  • Bean 已经初始化完成,可以被应用程序使用。

(8)销毁(Destruction)

  • 如果 Bean 实现了 DisposableBean 接口,Spring 会调用 destroy() 方法。
  • 如果 Bean 配置了自定义的销毁方法(如 destroy-method),Spring 会调用该方法。

2. Bean 生命周期的流程图

以下是 Spring Bean 生命周期的流程图:

实例化 Bean
     |
     v
属性赋值(依赖注入)
     |
     v
BeanNameAware 和 BeanFactoryAware
     |
     v
BeanPostProcessor 的前置处理
     |
     v
初始化(InitializingBean 和 init-method)
     |
     v
BeanPostProcessor 的后置处理
     |
     v
Bean 已就绪,可以被使用
     |
     v
销毁(DisposableBean 和 destroy-method)

3. 扩展点详解

Spring 提供了多个扩展点,允许开发者在 Bean 生命周期的不同阶段执行自定义逻辑:

(1)BeanPostProcessor

  • 用于在 Bean 初始化前后执行自定义逻辑。
  • 实现 postProcessBeforeInitialization()postProcessAfterInitialization() 方法。
   public class CustomBeanPostProcessor implements BeanPostProcessor {
       @Override
       public Object postProcessBeforeInitialization(Object bean, String beanName) {
           System.out.println("Before Initialization: " + beanName);
           return bean;
       }

       @Override
       public Object postProcessAfterInitialization(Object bean, String beanName) {
           System.out.println("After Initialization: " + beanName);
           return bean;
       }
   }

(2)InitializingBean 和 DisposableBean

  • InitializingBean 接口用于在 Bean 初始化时执行逻辑。
  • DisposableBean 接口用于在 Bean 销毁时执行逻辑。
   public class CustomBean implements InitializingBean, DisposableBean {
       @Override
       public void afterPropertiesSet() {
           System.out.println("Bean is initialized");
       }

       @Override
       public void destroy() {
           System.out.println("Bean is destroyed");
       }
   }

(3)自定义初始化方法和销毁方法

  • 可以通过 @Bean(initMethod = "init", destroyMethod = "cleanup") 或 XML 配置指定自定义的初始化和销毁方法。
   public class CustomBean {
       public void init() {
           System.out.println("Custom init method");
       }

       public void cleanup() {
           System.out.println("Custom destroy method");
       }
   }

4. Bean 生命周期示例

以下是一个完整的 Bean 生命周期示例:

public class MyBean implements BeanNameAware, BeanFactoryAware, InitializingBean, DisposableBean {
    private String name;

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public void setBeanName(String name) {
        System.out.println("BeanNameAware: " + name);
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) {
        System.out.println("BeanFactoryAware");
    }

    @Override
    public void afterPropertiesSet() {
        System.out.println("InitializingBean: afterPropertiesSet");
    }

    public void customInit() {
        System.out.println("Custom init method");
    }

    @Override
    public void destroy() {
        System.out.println("DisposableBean: destroy");
    }

    public void customDestroy() {
        System.out.println("Custom destroy method");
    }
}

配置:

<bean id="myBean" class="com.example.MyBean" init-method="customInit" destroy-method="customDestroy">
    <property name="name" value="John" />
</bean>

总结

Spring Bean 的生命周期包括实例化、属性赋值、初始化、使用和销毁等阶段。Spring 提供了多个扩展点(如 BeanPostProcessorInitializingBeanDisposableBean 等),允许开发者在 Bean 生命周期的不同阶段执行自定义逻辑。理解 Bean 的生命周期有助于更好地掌握 Spring 的工作原理,并在实际开发中灵活运用。

THE END
点赞9 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容