Spring接口——SmartLifecycle

有些场景我们需要在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继承自LifecyclePhased两个接口,一共定义了六个方法,简要说明如下:

方法作用
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

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值