有些场景我们需要在Spring 所有的bean 完成初始化后紧接着执行一些任务或者启动需要的异步服务。常见有几种解决方案
- j2ee 注解 启动前@PostConstruct 销毁前@PreDestroy 基于j2ee 规范
- springboot 的 org.springframework.boot.CommandLineRunner springboot 特性前面我已经介绍过了
- spring org.springframework.context.SmartLifecycle
在使用Spring开发时,我们都知道,所有bean都交给Spring容器来统一管理,如果我们想在容器本身的生命周期(比如容器启动、停止)事件上做一些工作怎么办呢?Spring提供了以下接口:Lifecycle接口
1.SmartLifecycle接口概览
我们先来看看SmartLifecycle
接口的类图:
如上所示,SmartLifecycle
继承自Lifecycle
和Phased
两个接口,一共定义了六个方法,简要说明如下:
方法 | 作用 |
---|---|
start() | bean初始化完毕后,该方法会被执行 |
stop() | 容器关闭后: spring容器发现当前对象实现了SmartLifecycle,就调用stop(Runnable), 如果只是实现了Lifecycle,就调用stop() |
isRunning() | 当前状态,用来判你的断组件是否在运行。 |
getPhase() | 控制多个SmartLifecycle的回调顺序的,返回值越小越靠前执行start()方法,越靠后执行stop()方法 |
isAutoStartup() | start方法被执行前先看此方法返回值,返回false就不执行start方法了 |
stop(Runnable) | 容器关闭后: spring容器发现当前对象实现了SmartLifecycle,就调用stop(Runnable), 如果只是实现了Lifecycle,就调用stop() |
可以看到,Lifecycle
接口的方法感知容器变化,而SmartLifecycle只是Lifecycle的增强版,可以自定义优先级(getPhase
),自主决定是否随容器启动(isAutoStartup
),以及停止时能接受一个runnable对象(stop(Runnable)
)。
这里介绍一下第三种 SmartLifecycle
SmartLifecycle 不仅仅能在初始化后执行一个逻辑,还能再关闭前执行一个逻辑,比如你一个服务在启动时向服务注册发现中心发一个信号告诉它服务上线了,下线前通知它你下线了。也就是实现了一个 从生到死 的轮回。
话不多说先实现一个SmartLifeCycle
@Component
public class Testss implements SmartLifecycle {
private boolean isRunning;
@Override
public void start() {
System.out.println("start...");
isRunning = true;
}
@Override
public void stop() {
System.out.println("stop...");
isRunning = false;
}
@Override
public boolean isRunning() {
return isRunning;
}
}
我们发现实现类需要实现3个方法,但是这3个方法并不是SmartLifecycle的方法而是
org.springframework.context.Lifecycle
方法:
- void start() 我们主要在该方法中启动任务或者其他异步服务,比如开启MQ接收消息当上下文被刷新(所有对象已被实例化和初始化之后)时,将调用该方法,默认生命周期 处理器将检查每个SmartLifecycle对象的isAutoStartup()方法返回的布尔值。如果为“true”,则该方法会被调用,而不是等待显式调用自己的start()方法,同时当上下文被刷新(所有对象已被实例化和初始化之后)时,将调用该方法,默认生命周期处理器将检查每个SmartLifecycle对象的isAutoStartup()方法返回的布尔值, 如果为true,则该方法会被调用,而不是等待显式调用自己的start()方法,boolean isRunning() 的状态信号也决定此方法是否执行只有当该方法返回false start()方法才会被执行,有兴趣可以看LifecycleProcessor相关实现
- void stop() 顾名思义 生命周期结束时调用的方法。只有当 boolean isRunning() 方法返回true 该方法才会被执行,该方法是属于Lifecyle接口的,被SmartLifeCycle作为了一个钩子。 实际执行的是SmartLifeCycle中的这个方法
- boolean isRunning() 作为 信号来判定 start 还是stop
链接:https://juejin.cn/post/6857890075477278734