这里介绍一下第三种 SmartLifecycle SmartLifecycle 不仅仅能在初始化后执行一个逻辑,还能再关闭前执行一个逻辑,比如你一个服务在启动时向服务注册发现中心发一个信号告诉它服务上线了...话不多说先实现一个SmartLifeCycle ?...我们发现实现类需要实现3个方法,但是这3个方法并不是SmartLifecycle的方法而是 org.springframework.context.Lifecycle 的方法: void start(...只有当 boolean isRunning() 方法返回true 该方法才会被执行,该方法是属于Lifecyle接口的,被SmartLifeCycle作为了一个钩子。...实际执行的是SmartLifeCycle中的这个方法 ?
二、Lifecycle在讲解SmartLifecycle接口时,先讲解SmartLifecycle接口的父接口Lifecycle,不用担心,它们的作用是一样,不过SmartLifecycle作为子类功能会更强大点...三、SmartLifecycle 3.1 SmartLifecycle的作用SmartLifecycle继承了Lifecycle接口,并且提供了更智能的功能:实现SmartLifecycle接口的组件可以自动启动和停止...3.2 SmartLifecycle的定义先来看一下SmartLifecycle接口的源码:public interface SmartLifecycle extends Lifecycle, Phased...3.3 SmartLifecycle的使用我们来实现SmartLifecycle接口,来看看它具体的实践效果:@Componentpublic class MySmartLifecycle implements...SmartLifecycle的使用有大量的实践案例,所以无论实战或阅读源码,都最好需要了解SmartLifecycle相关接口。如果您对本文有任何疑问或需要帮助,请在评论区留言,我会尽力解答。
SmartLifecycle接口概览; 2. spring容器启动与SmartLifecycle的关系; 3. spring容器关闭与SmartLifecycle的关系; 4....关于Lifecycle和SmartLifecycle; 5....实战SmartLifecycle接口扩展; SmartLifecycle接口概览 先来看看SmartLifecycle接口的类图: 如上图所示,在继承了Lifecycle和Phased两个接口后...,也期望关闭时多个Lifecycle实例能并行执行,快速结束,SmartLifecycle无疑更适合; 理论上已经基本熟悉了,接下来通过一次实战来加深印象,我们自定义一个SmartLifecycle的实现类...,并在springboot中验证以下; 实战SmartLifecycle接口扩展 本次实战的内容是创建一个springboot工程,在里面自定义一个SmartLifecycle接口的实现类,如果您不想敲代码
SmartLifecycle 相比于 LifeCycle,SmartLifecycle 中多了几个方法: public interface SmartLifecycle extends Lifecycle...如果使用了 SmartLifecycle,那么 Lifecycle 中的 stop 方法就不会被直接触发了,除非我们在 SmartLifecycle#stop 中手动去触发 Lifecycle#stop...我们来写一个 SmartLifecycle 的案例来试下: @Component public class MyLifeCycle implements SmartLifecycle { private...autoStartupOnly || (bean instanceof SmartLifecycle smartLifecycle && smartLifecycle.isAutoStartup()))...(bean instanceof SmartLifecycle smartLifecycle) || smartLifecycle.isAutoStartup())) { bean.start()
这篇文件就介绍一下Lifecycle接口,以及比它更聪明(Smart)的SmartLifecycle。...SmartLifecycle SmartLifecycle继承自Lifecycle,提供了更丰富的功能:第一,start()方法无需容器显式调用就可以被执行;第二,可以控制多SmartLifecycle...先来看一下SmartLifecycle接口的源码: public interface SmartLifecycle extends Lifecycle, Phased { int DEFAULT_PHASE...也正是基于Phased接口的这个方法来控制SmartLifecycle的执行顺序的。...SmartLifecycle#isRunning判断是否已经执行,返回false表示还未执行,则调用SmartLifecycle#start()执行。
答: 1、实现SmartLifecycle接口。 注意:排序在WebServerStartStopLifecycle之前运行(默认不用管)。...1、SmartLifecycle的运行时机:在容器启动最后finishRefresh阶段,在web服务真正启动之前(WebServerStartStopLifecycle,自己实现的SmartLifecycle...org.springframework.context.support.DefaultLifecycleProcessor#startBeans 2、监听ContextRefreshedEvent事件的运行时机:在SmartLifecycle
在这种情况下,我们就需要用到SmartLifecycle这个接口了 SmartLifecycle 其继承关系如下: 它本身除了继承了Lifecycle接口还继承了一个Phased接口,其接口定义如下:...再来看看SmartLifecycle本身这个接口的定义 public interface SmartLifecycle extends Lifecycle, Phased { int DEFAULT_PHASE...autoStartupOnly || (bean instanceof SmartLifecycle && ((SmartLifecycle) bean).isAutoStartup())) {...// 获取这个Bean执行的阶段,实际上就是调用SmartLifecycle中的getPhase方法 // 如果没有实现SmartLifecycle,而是单纯的实现了Lifecycle...(bean instanceof SmartLifecycle) || ((SmartLifecycle) bean).isAutoStartup())) { try {
在这种情况下,我们就需要用到SmartLifecycle这个接口了 SmartLifecycle 其继承关系如下: ?...再来看看SmartLifecycle本身这个接口的定义 public interface SmartLifecycle extends Lifecycle, Phased { int DEFAULT_PHASE...autoStartupOnly || (bean instanceof SmartLifecycle && ((SmartLifecycle) bean).isAutoStartup())) {...// 获取这个Bean执行的阶段,实际上就是调用SmartLifecycle中的getPhase方法 // 如果没有实现SmartLifecycle,而是单纯的实现了...(bean instanceof SmartLifecycle) || ((SmartLifecycle) bean).isAutoStartup())) { try {
SmartLifecycle 还有一种更高级的方法来实现我们的逻辑。这可以 Spring 高级开发必备技能哦。...SmartLifecycle 不仅仅能在初始化后执行一个逻辑,还能再关闭前执行一个逻辑,并且也可以控制多个 SmartLifecycle 的执行顺序,就像这个类名表示的一样,这是一个智能的生命周期管理接口...stop():容器关闭后,spring 容器发现当前对象实现了 SmartLifecycle,就调用 stop(Runnable), 如果只是实现了 Lifecycle,就调用 stop()。...getPhase:控制多个 SmartLifecycle 的回调顺序的,返回值越小越靠前执行 start() 方法,越靠后执行 stop() 方法。...stop(Runnable):容器关闭后,spring 容器发现当前对象实现了 SmartLifecycle,就调用 stop(Runnable), 如果只是实现了 Lifecycle,就调用 stop
接口的方法 SmartLifecycle spring-context-5.0.5.RELEASE-sources.jar!.../org/springframework/context/SmartLifecycle.java /** * Start this component....* @see SmartLifecycle#stop(Runnable) * @see org.springframework.beans.factory.DisposableBean...The callback must be executed after * the {@code SmartLifecycle} component does indeed stop...{@link Lifecycle#stop()} will not be called for * {@code SmartLifecycle} implementations unless
autoStartupOnly || (bean instanceof SmartLifecycle && ((SmartLifecycle) bean).isAutoStartup())) {...// 若实现了SmartLifecycle接口,则返回SmartLifecycle.getPhase(),否则默认返回0 int phase = getPhase(bean);...接口的实现类做了很多特殊化的处理,默认情况下: 实现了 SmartLifecycle 接口的 Bean,需要保证 SmartLifecycle.isAutoStartup 返回 true 才会被处理;...没实现 SmartLifecycle 接口,但是实现了 Lifecycle 接口的 Bean 会被直接处理; 并且,在处理 Bean 的时候,还会根据声明周期“阶段”按顺序从小到大排序: 实现了 SmartLifecycle...接口的 Bean,按照 SmartLifecycle.getPhase 返回值排序从小到大执行; 没实现 SmartLifecycle 接口,但是实现了 Lifecycle 接口的 Bean ,“阶段
在那种情况下,SmartLifecycle接口定义了另一种选择,也就是说getPhase()定义在它的父接口Phased中。...因此,实现了SmartLifecycle接口,getPhase()方法返回值为Integer.MIN_VALUE的对象将最先启动并最后停止。...当考虑相位值时,知道任何没有实现SmartLifecycle接口的Lifecycle对象的默认值为0是很重要的。...正如你看到的,在SmartLifecycle中定义的停止方法接收一个回调函数。任何实现在关闭进程完成之后都必须调用回调的run()方法。...另一方面refresh回调能使SmartLifecycle beans的另一个功能可用。
考虑实现org.springframework.context.SmartLifecycle接口来实现对指定bean自动启动的细粒度控制(包括启动时期)。...在那种情况下,SmartLifecycle接口定义了另一种选择,也就是说getPhase()定义在它的父接口Phased中。...因此,实现了SmartLifecycle接口,getPhase()方法返回值为Integer.MIN_VALUE的对象将最先启动并最后停止。...当考虑相位值时,知道任何没有实现SmartLifecycle接口的Lifecycle对象的默认值为0是很重要的。...另一方面refresh回调能使SmartLifecycle beans的另一个功能可用。
autoStartupOnly || (bean instanceof SmartLifecycle && ((SmartLifecycle) bean).isAutoStartup())) {...phases.isEmpty()) { phases.values().forEach(LifecycleGroup::start); } } 找到实现SmartLifecycle...(bean instanceof SmartLifecycle) || ((SmartLifecycle) bean).isAutoStartup())) { try { bean.start...那么我们基于SmartLifecycle实现业务初始化操作,简单代码如下: @Component public class MyInitializer implements SmartLifecycle...; } // 其他方法... } 4.监听ContextStartedEvent事件 对于AbstractApplicationContext本身也实现了Lifecycle接口,在前边SmartLifecycle
{ .... } SmartLifecycle 包含了 Phased 接口以及默认实现: public interface SmartLifecycle extends Lifecycle,...Integer.MAX_VALUE; @Override default int getPhase() { return DEFAULT_PHASE; } } 可以看出,只要实现了 SmartLifecycle...接入点一 - 通过添加实现 SmartLifecycle 接口的 Bean,指定 Phase 比 WebServerGracefulShutdownLifecycle 的 Phase 小 前面的分析中,...Lifecycle,在里面实现我们的优雅关闭接入,例如: @Log4j2 @Component public class BizThreadPoolShutdownLifecycle implements SmartLifecycle...但是问题就是,可能会引入某个框架里面带 Lifecycle bean,虽然他的 Phase 是正确的,小于 WebServerGracefulShutdownLifecycle 的,但是 SmartLifecycle.DEFAULT_PHASE
class DefaultRocketMQListenerContainer implements InitializingBean, RocketMQListenerContainer, SmartLifecycle...} //...... } DefaultRocketMQListenerContainer实现了InitializingBean, RocketMQListenerContainer, SmartLifecycle...ConsumeOrderlyStatus.SUSPEND_CURRENT_QUEUE_A_MOMENT 小结 DefaultRocketMQListenerContainer实现了InitializingBean, RocketMQListenerContainer, SmartLifecycle
优雅停机阶段变更 优雅停机由SmartLifecycle实现,在SmartLifecycle.DEFAULT_PHASE - 2048阶段开始,Web服务器在SmartLifecycle.DEFAULT_PHASE...任何参与优雅关机的SmartLifecycle实现都应该被相应地更新。
. // 2.首先将刷新完毕事件传播到生命周期处理器(触发isAutoStartup方法返回true的SmartLifecycle的start方法) getLifecycleProcessor(...会触发全部的Lifecycle; // 当autoStartupOnly=true,也就是ApplicationContext刷新时容器自动启动,只会触发isAutoStartup方法返回true的SmartLifecycle...autoStartupOnly || (bean instanceof SmartLifecycle && ((SmartLifecycle) bean).isAutoStartup())) {
SIGTERM信号你的进程要正常接收到信号你的应用要正常处理信号应用要正常处理信号SpringBoot已经做了相关处理, 我们只要实现接口即可实现org.springframework.context.SmartLifecycle...getPhase方法定义优先级@Overridepublic int getPhase() { //在 WebServerGracefulShutdownLifecycle 那一组之后 return SmartLifecycle.DEFAULT_PHASE
LifecycleProcessor和DefaultLifecycleProcessor都是Spring3.0提供的,Lifecycle在Spring2.0就有了,但子接口SmartLifecycle是...autoStartupOnly || (bean instanceof SmartLifecycle && ((SmartLifecycle) bean).isAutoStartup())) {...因为实现了SmartLifecycle接口会有一个phase值,根据上面源码会根据此值分组执行。...所以,我们要想要这个功能,请实现SmartLifecycle,而不是Lifecycle接口 结论: Spring的IoC容器启动过程中,默认只会执行实现了SmartLifecycle接口且isAutoStartup...(所以你要想容器启动后就执行,请实现SmartLifecycle吧) AbstractApplicationContext#start() 手动调用触发。
领取专属 10元无门槛券
手把手带您无忧上云