一、核心作用
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 应用的必备技能。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论