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))。