一、核心作用
SmartLifecycle 是 Spring 框架中用于 精确控制组件生命周期阶段 的高级接口,主要解决三类问题:
- 有序启停:控制多个组件启动/关闭顺序
- 阶段化处理:将初始化/销毁操作划分为不同阶段
- 上下文感知:获取应用上下文状态变化事件
二、典型应用场景
场景 | 具体用途 | 优势体现 |
---|---|---|
连接池管理 | 数据库/Redis连接池的预热和优雅关闭 | 避免连接泄漏 |
线程池控制 | 异步线程池的初始化与任务排空 | 防止任务丢失 |
外部服务注册 | 服务注册中心的上线通知与下线注销 | 保证服务状态一致性 |
定时任务调度 | 分布式任务调度器的启动与暂停 | 精准控制任务执行周期 |
硬件设备控制 | IoT设备连接初始化与安全断开 | 保障设备操作安全性 |
三、核心方法详解
public interface SmartLifecycle extends Lifecycle {
// 关键方法1:启动组件(自动触发)
void start();
// 关键方法2:停止组件(带异步通知)
default void stop(Runnable callback) {
stop();
callback.run();
}
// 关键方法3:相位控制(数值越小优先级越高)
int getPhase();
// 其他方法
boolean isAutoStartup();
boolean isRunning();
}
四、实战代码示例
基本案例:
@Component
public class DatabaseConnector implements SmartLifecycle {
private volatile boolean running = false;
private ConnectionPool pool;
@Override
public void start() {
if (!running) {
this.pool = initConnectionPool(); // 连接池预热
running = true;
}
}
@Override
public void stop() {
if (running) {
pool.safeRelease(); // 安全释放连接
running = false;
}
}
@Override
public int getPhase() {
return Integer.MIN_VALUE + 1000; // 高优先级组件
}
}
主动结束当前线程的处理案例:
@Slf4j
@Configuration
public class SensitiveWordsConfiguration implements SmartLifecycle {
/**
* lifeRunning
*/
private volatile boolean lifeRunning = false;
/**
* 更新时间间隔
*/
private static final long UPDATE_TIME_SECONDS = 10 * 60;
/**
* 是否终止线程
*/
private volatile boolean threadStop = false;
/**
* taskExecutor
*/
@Autowired
private ThreadPoolTaskExecutor taskExecutor;
/**
* 当前线程任务
*/
private Future<?> future;
/**
* 实现热更新,修改词典后自动加载
*/
private void startScheduledUpdate() {
while (!threadStop && !Thread.currentThread().isInterrupted()) {
try {
log.debug("SensitiveWordConfig#startScheduledUpdate start update...");
//这里做业务处理
//...
TimeUnit.SECONDS.sleep(UPDATE_TIME_SECONDS);
} catch (InterruptedException e) {
log.info("SensitiveWordConfig#startScheduledUpdate interrupted: {}", e.getMessage());
Thread.currentThread().interrupt();
break;
}
}
}
@Override
public void start() {
// 启动定时更新任务线程
this.future = taskExecutor.submit(this::startScheduledUpdate);
lifeRunning = true;
}
@Override
public void stop() {
threadStop = true;
// 主动终止当前线程的(否则会持续sleep直到线程池shutdownNow导致占用停止时间)
this.future.cancel(true);
lifeRunning = false;
}
@Override
public boolean isRunning() {
return lifeRunning;
}
}
要特别注意的是
:这个案例中使用了spring上下文中的 ThreadPoolTaskExecutor,所以不能使用 @PreDestroy 注解方法来进行回收处理,因为spring在关闭容器时会先对上下问中的线程池进行shutdown完成后,才会执行所有bean的destroy方法。
五、相位控制策略
通过 getPhase()
返回值控制执行顺序:
- 启动顺序:相位值 从小到大 执行
- 关闭顺序:相位值 从大到小 执行
六、与普通Lifecycle的区别
特性 | Lifecycle | SmartLifecycle |
---|---|---|
自动启动 | ❌ 需手动触发 | ✅ 支持自动启动 |
停止回调 | ❌ 无 | ✅ 带异步完成通知 |
执行顺序控制 | ❌ 不支持 | ✅ 相位值精确控制 |
上下文刷新集成 | ❌ 有限支持 | ✅ 深度集成上下文生命周期 |
七、注意事项
- 异常处理:在
start()
/stop()
中必须捕获异常,避免阻断全局生命周期流程 - 线程安全:确保实现类方法的线程安全性
- 性能影响:避免在生命周期方法中执行耗时操作(>1秒的操作建议异步化)
- 容器兼容:与
@PostConstruct
/@PreDestroy
注解配合使用时注意执行顺序。执行顺序@PostConstruct
>start()
>stop()
>@PreDestroy
。
通过合理使用 SmartLifecycle,可以实现 服务零中断重启、资源按序回收 等高级功能,是构建企业级 Spring 应用的必备技能。
(END)