Spring中的SmartLifecycle和Lifecycle

概述

  1. Lifecyclespring提供的生命周期操作的一个接口,用户可以在容器的启动和停止时执行自己的逻辑。
  2. SmartLifecycle是对Lifecycle的扩展,例如增加了控制顺序等,详细会在下面介绍
  3. bean的初始化和销毁的方法相比,bean的初始化方法和销毁方法是Bean生命周期级别的;而Lifecycle是容器生命周期级别的

介绍

Lifecycle

举例

@Component
public class TestLifecycle implements Lifecycle {

    //此组件运行状态的标识
    private volatile boolean running = false;

    //容器启动调用
    @Override
    public void start() {
        System.out.println("TestLifecycle.start()执行");
        running = true;
    }

    //容器停止调用
    @Override
    public void stop() {
        System.out.println("TestLifecycle.stop()执行");
        running = false;
    }

    //查看是否已运行。返回false,start()才执行。返回true,stop()才执行
    @Override
    public boolean isRunning() {
        System.out.println("TestLifecycle.isRunning()执行");
        return running;
    }
}

结果

TestLifecycle.isRunning()执行 running: false
TestLifecycle.start()执行
TestLifecycle.isRunning()执行 running: true
TestLifecycle.stop()执行

注意
一定要显示调用spring容器的startstop方法,Lifecycle的接口方法才会被执行。所以一般都会使用SmartLifecycle

SmartLifecycle

特点

  1. 不需要显示调用容器的start()方法,就可以回调SmartLifecycle接口的start()
  2. 容器中如果有多个SmartLifecycle实例,可以方便控制调用顺序

举例

@Component
public class TestSmartLifecycle implements SmartLifecycle {

    //此组件运行状态的标识
    private volatile boolean running = false;

    /**
     * 只有返回true,容器才会在refresh时回调start()方法。
     * 返回false,则和Lifecycle相同,需要显示调用容器的start()方法。
     */
    @Override
    public boolean isAutoStartup() {
        return true;
    }

    /**
     *
     * @param callback
     */
    @Override
    public void stop(Runnable callback) {
        System.out.println("- - - TestSmartLifecycle stop callback- - -");
        stop();
        callback.run();
    }

    @Override
    public void start() {
        System.out.println("- - - TestSmartLifecycle start - - -");
        running = true;
    }

    @Override
    public void stop() {
        System.out.println("- - - TestSmartLifecycle stop - - -");
        running = false;
    }

    @Override
    public boolean isRunning() {
        System.out.println("- - - TestSmartLifecycle isRunning running: " + running + "- - -");
        return running;
    }

    /**
     * 阶段值   越小越靠前执行start()方法,越靠后执行stop()方法
     *
     * @return
     */
    @Override
    public int getPhase() {
        return 0;
    }
}

结果

- - - TestSmartLifecycle isRunning running: false- - -
- - - TestSmartLifecycle start - - -

- - - TestSmartLifecycle isRunning running: true- - -
- - - TestSmartLifecycle stop callback- - -
- - - TestSmartLifecycle stop - - -

方法介绍

isAutoStartup()

只有返回true,容器才会在refresh时回调start()方法。
返回false,则和Lifecycle相同,需要显示调用容器的start()方法。

start()

Lifecycle接口中的功能一样,当刷新容器(也就是启动完成)时调用

stop(Runnable callback)

当容器停止时,回调该方法。当执行完你自定义的逻辑后,一定要调用下callback.run() 这个是为了,告诉容器你已停止自己的组件完成。
这里多说一点,很多源码会在该方法内仅写两行代码,参考上面例子。一行是stop()把真正的逻辑转发到stop()
这个方法。另一行就是必须调用的callback.run()

stop()

不会被Spring框架调用到!

isRunning()

Lifecycle接口中的功能一样,判断组件是否在运行

getPhase()

控制多个SmartLifecycle的回调顺序的,返回值越小越靠前执行start()方法,越靠后执行stop()方法

参考博客:

https://blog.csdn.net/Bronze5/article/details/106558309

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值