随笔 - 303  文章 - 0  评论 - 3  阅读 - 15万

Spring生命周期管理之SmartLifecycle,LifecycleProcesso接口详述

  Spring Boot run方法启动后相应的服务也随之启动,这个操作很妙。使用者都不用关心什么服务怎么启动,不管多少个服务怎么启动只要符合Spring Boot的启动规则都可以使用其run方法同一启动。

  Spring Boot run()方法剖析 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)对于run方法的剖析可知其底层本质就是Spring框架中的refresh方法。

  通过Eureka Server启动过程 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)可知对于Eureka服务启动进行操作的事finishRefresh方法:

    

   就是很精妙地将Eureka服务启动与Spring 容器耦合了。而耦合的契机就在于SmartLifecycle和LifecycleProcessor接口。简言之就是将Eureka服务加入到了Spring的生命周期管理,Spring管理Eureka服务的整个生命周期解放生产力了。

   看看接口继承关系图: 

          

   从上图可知无论LifecycleProcessor还是SmartLifecycle都继承了Lifecycle,同时Spring容器AbstractapplicaitonContext也继承了Lifecycle即Lifecycle定义Spring容器对象的生命周期,任何spring管理对象都可以实现该接口。当ApplicationContext本身接收启动和停止信号(例如在运行时停止/重启场景)时,spring容器将在容器上下文中找出所有实现了Lifecycle及其子类接口的类,并一一调用它们实现的类。具体实现就委托给了生命周期处理器LifecycleProcessor(容器中)。

  为什么有smartLifecycle接口?我们看下继承关系中的方法:   

                    

   利用两个小demo看看Lifecycle:

    eg1:

          

   在案例中,main函数执行并没有主动调用start方法。

    eg2:

          

   从执行结果看调用applicationcontext中的start和stop方法,容器执行实现了Lifecycle接口的bean中的start和stop方法。

   另用一个小demo看看SmartLifecycle接口:

    eg3:

          

    main函数启动时,并没有像前两个案例那样需要在main中使用applicationcontext.start和stop方法。而是根据isAutoStartUp标志自动调用start方法。

  对于LifeCycle与SmartLifeCycle的区别就通过这几个案例很明显的表现出来了:

          

  这个isAutoStartup方法不就是模板设计模式中的钩子方法么(参考五、模板方法设计模式及在Spring中的应用 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com))。

posted on   池塘里洗澡的鸭子  阅读(467)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示