首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏码农小胖哥的码农生涯

    高级java开发必须掌握的Spring接口——SmartLifecycle

    这里介绍一下第三种 SmartLifecycle SmartLifecycle 不仅仅能在初始化后执行一个逻辑,还能再关闭前执行一个逻辑,比如你一个服务在启动时向服务注册发现中心发一个信号告诉它服务上线了 话不多说先实现一个SmartLifeCycle ? 我们发现实现类需要实现3个方法,但是这3个方法并不是SmartLifecycle的方法而是 org.springframework.context.Lifecycle 的方法: void start( 只有当 boolean isRunning() 方法返回true 该方法才会被执行,该方法是属于Lifecyle接口的,被SmartLifeCycle作为了一个钩子。 实际执行的是SmartLifeCycle中的这个方法 ?

    7.4K22发布于 2019-12-05
  • 来自专栏代码生涯

    玩转Spring生命周期之Lifecycle和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相关接口。如果您对本文有任何疑问或需要帮助,请在评论区留言,我会尽力解答。

    2.4K127编辑于 2024-01-16
  • 来自专栏实战docker

    spring4.1.8扩展实战之四:感知spring容器变化(SmartLifecycle接口)

    SmartLifecycle接口概览; 2. spring容器启动与SmartLifecycle的关系; 3. spring容器关闭与SmartLifecycle的关系; 4. 关于Lifecycle和SmartLifecycle; 5. 实战SmartLifecycle接口扩展; SmartLifecycle接口概览 先来看看SmartLifecycle接口的类图: 如上图所示,在继承了Lifecycle和Phased两个接口后 ,也期望关闭时多个Lifecycle实例能并行执行,快速结束,SmartLifecycle无疑更适合; 理论上已经基本熟悉了,接下来通过一次实战来加深印象,我们自定义一个SmartLifecycle的实现类 ,并在springboot中验证以下; 实战SmartLifecycle接口扩展 本次实战的内容是创建一个springboot工程,在里面自定义一个SmartLifecycle接口的实现类,如果您不想敲代码

    94420编辑于 2022-05-06
  • 来自专栏玩转JavaEE

    面试题解答:Spring Lifecycle 和 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()

    41840编辑于 2023-10-23
  • 来自专栏丑胖侠

    Spring的Lifecycle和SmartLifecycle,可以没用过,但不能不知道!

    这篇文件就介绍一下Lifecycle接口,以及比它更聪明(Smart)的SmartLifecycleSmartLifecycle SmartLifecycle继承自Lifecycle,提供了更丰富的功能:第一,start()方法无需容器显式调用就可以被执行;第二,可以控制多SmartLifecycle 先来看一下SmartLifecycle接口的源码: public interface SmartLifecycle extends Lifecycle, Phased { int DEFAULT_PHASE 也正是基于Phased接口的这个方法来控制SmartLifecycle的执行顺序的。 SmartLifecycle#isRunning判断是否已经执行,返回false表示还未执行,则调用SmartLifecycle#start()执行。

    78020编辑于 2021-12-07
  • 来自专栏nobody

    【八股文Java】: 在Spring生态下,实现预热功能(比如提前加载本地缓存),需要使用哪些扩展点​。为什么?

    答: 1、实现SmartLifecycle接口。 注意:排序在WebServerStartStopLifecycle之前运行(默认不用管)。 1、SmartLifecycle的运行时机:在容器启动最后finishRefresh阶段,在web服务真正启动之前(WebServerStartStopLifecycle,自己实现的SmartLifecycle org.springframework.context.support.DefaultLifecycleProcessor#startBeans 2、监听ContextRefreshedEvent事件的运行时机:在SmartLifecycle

    95640编辑于 2023-10-20
  • 来自专栏程序员DMZ

    Spring官网阅读(九)Spring中Bean的生命周期(上)

    在这种情况下,我们就需要用到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 {

    95121发布于 2020-07-06
  • 来自专栏Java程序员的技能宝典

    Spring官网阅读系列(九):Spring中Bean的生命周期(上)

    在这种情况下,我们就需要用到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 {

    1.1K30发布于 2020-03-27
  • 来自专栏SnailTyan

    Spring框架参考手册_5.0.0_中文版_Part II_3.6

    在那种情况下,SmartLifecycle接口定义了另一种选择,也就是说getPhase()定义在它的父接口Phased中。 因此,实现了SmartLifecycle接口,getPhase()方法返回值为Integer.MIN_VALUE的对象将最先启动并最后停止。 当考虑相位值时,知道任何没有实现SmartLifecycle接口的Lifecycle对象的默认值为0是很重要的。 正如你看到的,在SmartLifecycle中定义的停止方法接收一个回调函数。任何实现在关闭进程完成之后都必须调用回调的run()方法。 另一方面refresh回调能使SmartLifecycle beans的另一个功能可用。

    56130编辑于 2022-05-09
  • 来自专栏全栈程序员必看

    spring容器初始化过程中出现异常_spring容器什么时候启动

    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 ,“阶段

    95010编辑于 2022-09-23
  • 来自专栏后端架构师

    了解这些,你就可以在Spring启动时为所欲为了

    SmartLifecycle 还有一种更高级的方法来实现我们的逻辑。这可以 Spring 高级开发必备技能哦。 SmartLifecycle 不仅仅能在初始化后执行一个逻辑,还能再关闭前执行一个逻辑,并且也可以控制多个 SmartLifecycle 的执行顺序,就像这个类名表示的一样,这是一个智能的生命周期管理接口 stop():容器关闭后,spring 容器发现当前对象实现了 SmartLifecycle,就调用 stop(Runnable), 如果只是实现了 Lifecycle,就调用 stop()。 getPhase:控制多个 SmartLifecycle 的回调顺序的,返回值越小越靠前执行 start() 方法,越靠后执行 stop() 方法。 stop(Runnable):容器关闭后,spring 容器发现当前对象实现了 SmartLifecycle,就调用 stop(Runnable), 如果只是实现了 Lifecycle,就调用 stop

    1.4K30发布于 2021-01-14
  • 来自专栏码匠的流水账

    聊聊springcloud的EurekaClientAutoConfiguration

    接口的方法 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

    1.7K20发布于 2018-09-17
  • 来自专栏SnailTyan

    Spring框架参考手册_5.0.0_中英文对照版_Part II_3.6

    考虑实现org.springframework.context.SmartLifecycle接口来实现对指定bean自动启动的细粒度控制(包括启动时期)。 在那种情况下,SmartLifecycle接口定义了另一种选择,也就是说getPhase()定义在它的父接口Phased中。 因此,实现了SmartLifecycle接口,getPhase()方法返回值为Integer.MIN_VALUE的对象将最先启动并最后停止。 当考虑相位值时,知道任何没有实现SmartLifecycle接口的Lifecycle对象的默认值为0是很重要的。 另一方面refresh回调能使SmartLifecycle beans的另一个功能可用。

    50750编辑于 2022-05-09
  • 来自专栏一个执拗的后端搬砖工

    从@PostConstruct重新认识初始化

    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

    84440编辑于 2023-09-07
  • 来自专栏码匠的流水账

    聊聊rocketmq的DefaultRocketMQListenerContainer

    class DefaultRocketMQListenerContainer implements InitializingBean, RocketMQListenerContainer, SmartLifecycle } //...... } DefaultRocketMQListenerContainer实现了InitializingBean, RocketMQListenerContainer, SmartLifecycle ConsumeOrderlyStatus.SUSPEND_CURRENT_QUEUE_A_MOMENT 小结 DefaultRocketMQListenerContainer实现了InitializingBean, RocketMQListenerContainer, SmartLifecycle

    1.8K10发布于 2019-10-31
  • 来自专栏码农小胖哥的码农生涯

    Spring Boot 3.0 正式发布,这份升级指南必须收藏

    优雅停机阶段变更 优雅停机由SmartLifecycle实现,在SmartLifecycle.DEFAULT_PHASE - 2048阶段开始,Web服务器在SmartLifecycle.DEFAULT_PHASE 任何参与优雅关机的SmartLifecycle实现都应该被相应地更新。

    6.3K20编辑于 2023-01-30
  • 来自专栏java-spring

    Spring源码之九finishRefresh详解

    . // 2.首先将刷新完毕事件传播到生命周期处理器(触发isAutoStartup方法返回true的SmartLifecycle的start方法) getLifecycleProcessor( 会触发全部的Lifecycle; // 当autoStartupOnly=true,也就是ApplicationContext刷新时容器自动启动,只会触发isAutoStartup方法返回true的SmartLifecycle autoStartupOnly || (bean instanceof SmartLifecycle && ((SmartLifecycle) bean).isAutoStartup())) {

    55020编辑于 2022-03-11
  • 来自专栏BAT的乌托邦

    【小家Spring】Spring IOC容器启动流程 AbstractApplicationContext#refresh()方法源码分析(二),Spring容器启动/刷新的完整总结

    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() 手动调用触发。

    2.5K20发布于 2019-09-03
  • 来自专栏code-x

    Docker Graceful Shutdown

    SIGTERM信号你的进程要正常接收到信号你的应用要正常处理信号应用要正常处理信号SpringBoot已经做了相关处理, 我们只要实现接口即可实现org.springframework.context.SmartLifecycle getPhase方法定义优先级@Overridepublic int getPhase() { //在 WebServerGracefulShutdownLifecycle 那一组之后 return SmartLifecycle.DEFAULT_PHASE

    58050编辑于 2023-07-10
  • 来自专栏学习计划

    spring应用篇

    和初始化回调一样,同样有实现类(DisposableBean)、注解(@PreDestroy)和xml配置方式(destroy-method), 启动和关闭回调 需要实现Lifecycle或者SmartLifecycle 它不好的地方在于,需要显示调用start和stop方法,但一般的web项目都是使用了springboot、springMvc等,容器入口得被封装起来了,无法去调用这些方法,这时候就扩展出了SmartLifecycle ,它不需要显示调用start方法,可以控制多个smartLifecycle实例的调用顺序。 SmartLifecycle有6个方法,3个是新增的,其他3个是lifeCycle里的。 start方法的优先级越高,值越大,执行stop方法的优先级越高 int getPhase(); // 在容器初始化完成,会调用finishRefresh方法,里面通过Lifecycle处理器,获取到所有的smartLifecycle

    56310发布于 2021-01-29
领券