一个普通 bean 的构建过程

(下图全文精华)

bean 生命周期回调

InitialingBeanDisposableBean 是两个接口,bean 实现这两个接口以及对应的方法即可定义在初始化以及销毁时的回调函数。除此之外,还可以通过在 bean 的定义中指定方法名称的方式,或者是使用 @PostConstruct@PreDestroy 两个注解定义这两个回调。

你甚至可以同时使用这三种方式,他们的执行顺序是:注解 -> 接口 -> 指定方法。

容器生命周期回调

bean 中同样可以定义相对应用的生命周期的回调,主要通过实现以下接口实现。

public interface Lifecycle {

    void start();

    void stop();

    boolean isRunning();
}

当 ApplicationContext 受到启动或停止的信号时,将调用实现了 Lifecycle 接口的类上的回调。

public interface Phased {

    int getPhase();
}

这些回调可能具有顺序,bean 实现 Phased 接口返回一个值带表调用的顺序(可以为负数)。

public interface SmartLifecycle extends Lifecycle, Phased {

    boolean isAutoStartup();

    void stop(Runnable callback);
}

LifecycleProcessor

响应应用的生命周期的回调是由容器( ApplicationContext )调用 LifecycleProcessor (一个接口),在默认的实现 DefaultLifecycleProcessor 中,在受到停止信号后留有 30s 的时间执行回调。

此外

bean 除了可以对自身和容器的生命周期设置回调函数意外,还可以通过实现其他 xxxAware 接口为其他范围的生命周期设置回调。

详见:Core Technologies (spring.io)