• Spring容器生命周期--SmartLifecycle的用法


    原文网址:Spring容器生命周期--SmartLifecycle的用法_IT利刃出鞘的博客-CSDN博客

    简介

    说明

    本文介绍Spring容器生命周期SmartLifeCycle的用法。

    Bean的初始化方法和销毁方法是Bean生命周期级别的;而Lifecycle是容器生命周期级别的。如果我们想在容器本身的生命周期(比如容器启动完成后、停止之前)事件上做一些工作,可以使用LifeCycle接口。

    SmartLifecycle是Lifecycle的一个子接口,比Lifecycle有更丰富的功能。其中有两点最重要的改进:

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

    方法

    方法名

    描述

    isAutoStartup()

    一定要返回true。否则,容器启动时不会回调start()方法。

    true:让Lifecycle类所在的上下文在调用`refresh`时,能够自己自动进行回调。
    false:表明组件打算通过显式的start()调用来启动,类似于普通的Lifecycle实现。这个一定要返回true,不然就跟Lifecycle一样了。

    getPhase()

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

    isRunning()

    与Lifecycle接口中的功能一样,用来判你的断组件是否在运行。

    start()

    如果类A没在运行(isRunning返回false),则走该方法;否则不走该方法。

    当刷新容器(启动完成)时调用。跟Lifecycle接口一样。

    stop(Runnable callback)

    当容器停止时,回调该方法。

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

    此方法是有超时时间的,默认为30s。可以通过以下方式设置超时时间

    stop()

    需要自己调用。不会被Spring框架调用到

    stop(Runnable callback)

    其他网址:Spring 5.0.0框架介绍_中文版_3.6

    在SmartLifecycle中定义的停止方法接收一个回调函数。任何实现在关闭进程完成之后都必须调用回调的run()方法。当需要时这可以进行异步关闭,因为LifecycleProcessor接口、DefaultLifecycleProcessor接口的默认实现会等待每个阶段的对象组直到达到超时值,然后调用回调函数。默认每个阶段的超时值为30秒。可以在上下文中通过定义名为”lifecycleProcessor”的bean来覆盖默认的生命周期处理器实例。如果你只想修改超时值,这样改即可:

    1. <bean id="lifecycleProcessor" class="org.springframework.context.support.DefaultLifecycleProcessor">
    2. <property name="timeoutPerShutdownPhase" value="10000"/>
    3. bean>

    简单示例

    代码

    1. package com.example.config;
    2. import org.springframework.context.SmartLifecycle;
    3. import org.springframework.stereotype.Component;
    4. @Component
    5. public class MySmartLifecycle implements SmartLifecycle {
    6. private volatile boolean running = false;
    7. /**
    8. * true:让Lifecycle类所在的上下文在调用`refresh`时,能够自己自动进行回调
    9. * false:表明组件打算通过显式的start()调用来启动,类似于普通的Lifecycle实现。
    10. */
    11. @Override
    12. public boolean isAutoStartup() {
    13. return true;
    14. }
    15. /**
    16. * 很多框架中,把真正逻辑写在stop()方法内。比如quartz和Redis的spring支持包
    17. */
    18. @Override
    19. public void stop(Runnable callback) {
    20. System.out.println("stop(callback)");
    21. stop();
    22. callback.run();
    23. }
    24. @Override
    25. public void start() {
    26. System.out.println("start()");
    27. running = true;
    28. }
    29. @Override
    30. public void stop() {
    31. System.out.println("stop()");
    32. running = false;
    33. }
    34. @Override
    35. public boolean isRunning() {
    36. System.out.println("isRunning()");
    37. return running;
    38. }
    39. /**
    40. * 阶段值。越小:start()方法越靠前,stop()方法越靠后
    41. */
    42. @Override
    43. public int getPhase() {
    44. System.out.println("getPhase()");
    45. return 0;
    46. }
    47. }

    测试

    启动时:

    1. . ____ _ __ _ _
    2. /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
    3. ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
    4. \\/ ___)| |_)| | | | | || (_| | ) ) ) )
    5. ' |____| .__|_| |_|_| |_\__, | / / / /
    6. =========|_|==============|___/=/_/_/_/
    7. :: Spring Boot :: (v2.3.0.RELEASE)
    8. 2021-03-09 19:30:57.138 INFO 6600 --- [ main] com.example.DemoApplication : Starting DemoApplication on DESKTOP-QI6B9ME with PID 6600 (E:\work\Idea_proj\demo_JAVA\demo_SpringBoot\target\classes started by Liu in E:\work\Idea_proj\demo_JAVA\demo_SpringBoot)
    9. 2021-03-09 19:30:57.143 INFO 6600 --- [ main] com.example.DemoApplication : No active profile set, falling back to default profiles: default
    10. 2021-03-09 19:30:57.899 INFO 6600 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
    11. 2021-03-09 19:30:57.907 INFO 6600 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
    12. 2021-03-09 19:30:57.907 INFO 6600 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.35]
    13. 2021-03-09 19:30:57.986 INFO 6600 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
    14. 2021-03-09 19:30:57.986 INFO 6600 --- [ main] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 808 ms
    15. 2021-03-09 19:30:58.135 INFO 6600 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
    16. getPhase()
    17. isRunning()
    18. start()
    19. 2021-03-09 19:30:58.260 INFO 6600 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
    20. 2021-03-09 19:30:58.268 INFO 6600 --- [ main] com.example.DemoApplication : Started DemoApplication in 1.442 seconds (JVM running for 2.44)

    关闭时:

    1. getPhase()
    2. isRunning()
    3. stop(callback)
    4. stop()

  • 相关阅读:
    Java语言程序设计-关键术语(第一弹)
    配置 rust国内源
    Git - 基于IDEA/命令撤销工作区和暂存区的修改
    【毕业设计】单片机与NBIOT通信模块 - 单片机 物联网 stm32
    天堂2服务器基本设置
    离子液体定制|甜菜碱离子液体[BetaineC16][H2PO4]修饰猪胰脂肪酶(PPL)
    k8s图形界面登录报错Failure
    FOC直流无刷电机控制算法 理论到实践 —— 理论(二)
    saas多用户小程序商城源码
    基于Python实现的类Pascal语言的词法分析和语法分析器
  • 原文地址:https://blog.csdn.net/feiying0canglang/article/details/127156520