小杰在前面的文章讲过可以使用 @PostConstruct、InitializingBean 、xml init、 @PreDestroy 、DisposableBean 、xml destroy来处理 Bean 的初始化和销毁,上述这些操作是属于 Bean 生命周期的。
那如果我想在容器本身的生命周期(比如容器启动、停止)上做一些工作怎么办呢?Spring 提供了以下接口。
Lifecycle定义启动/停止生命周期方法的通用接口。
自定义Lifecycle实现类 测试使用 Lifecycle这种方式,需要显示的调用容器的 start、stop方法。 显得笨重,所以我们使用另外一种方式 :SmartLifecycle。
SmartLifecycle看到的源码定义,SmartLifecycle除了继承Lifecycle之外,还继承了 Phased。并且新增了几个方法:
isAutoStartup:是否自动启动。为 treu,则自动调用start();为 false,则需要显示调用 start()。stop:当 isRunning 方法返回 true 时,该方法才会被调用。getPhase:来自于 Phased 接口,当容器中有多个实现了 SmartLifecycle的类,这个时候可以依据 getPhase方法返回值来决定start 方法、 stop方法的执行顺序。 start 方法执行顺序按照 getPhase方法返回值从小到大执行,而 stop方法则相反。比如: 启动时:1 比 3 先执行,-1 比 1 先执行,退出时:3 比 1 先退出,1 比 -1 先退出。 自定义SmartLifecycle实现类将代码进行启动,控制台打印如下内容:
发现并没有执行 stop方法,这是因为容器问题。如果在Spring Boot项目会自动执行的,小伙伴可以试一试。
在本例中,还是需要显示调用 stop方法。
发现执行了stop(Runnable callback),并没有执行 stop方法。这是因为当前类是 SmartLifecycle的子类,如果要执行 stop方法,需要在stop(Runnable callback)显示调用。
启动结果如下:
CustomizeSmartLifecycle isRunning() ==== falseCustomizeSmartLifecycle start()CustomizeSmartLifecycle isRunning() ==== trueCustomizeSmartLifecycle stop(Runnable callback)CustomizeSmartLifecycle stop()
注意:在stop(Runnable callback)方法中不要忘记调用 callback.run()方法。否则DefaultLifecycleProcessor会认为这个SmartLifecycle没有stop完成,程序会等待一定时间,默认30秒后才会自动结束。
多个实现类getPhase方法返回 -1。按照前面所说的结论,那就是 CustomizeSmartLifecycle2的start方法会先执行,然后 CustomizeSmartLifecycle2的stop方法最后执行。我们一起来看看执行结果吧!
执行结果:
CustomizeSmartLifecycle2 isRunning() =====> falseCustomizeSmartLifecycle2 start() =====>CustomizeSmartLifecycle isRunning() ==== falseCustomizeSmartLifecycle start()CustomizeSmartLifecycle isRunning() ==== trueCustomizeSmartLifecycle stop(Runnable callback)CustomizeSmartLifecycle2 isRunning() =====> trueCustomizeSmartLifecycle2 stop(Runnable callback) =====>
跟结论保持一致。
源码分析基本的使用就到此结束啦!我们来结合源码分析分析吧!
我们来到 finishRefresh方法的 getLifecycleProcessor().onRefresh();方法。
getLifecycleProcessor()方法获得容器中的 LifecycleProcessor对象,默认就是 DefaultLifecycleProcessor。
LifecycleProcessor接口中就定义的两个方法。onRefresh、onClose。
onRefresh我们先来看一下 onRefresh方法的内部逻辑,分析它是如何自动调用 start方法的。
这里注意一下 autoStartupOnly的值为 true。
autoStartupOnly=true,调用容器的 refresh 方法,由容器调用 onRefresh方法自动启动,只会触发 isAutoStartup方法返回 true 的SmartLifecycle。而 isAutoStartup属性,小杰在分析SmartLifecycle的时候已经讲过。autoStartupOnly=false,显示调用 start()方法进行启动,会触发全部的Lifecycle onCloseonClose在我没有找到调用点,但是 onClose内部会调用stopBeans()方法。我们直接分析stopBeans方法。
stopBeans方法跟 startBeans的逻辑大体差不多,然后调用 stop方法。
stop创建一个 CountDownLatch对象,如果 count不为 0 ,则线程进行等待,默认等待 30 s。
doStopdoStop 方法的逻辑很简单。区分是否是SmartLifecycle类型,如果是执行stop(Runnable callback)方法,反之执行 stop()方法。
关于Lifecycle的使用与源码分析就到这啦!
到此这篇关于Spring Lifecycle的使用的文章就介绍到这了,更多相关Spring Lifecycle使用内容请搜索七叶笔记以前的文章或继续浏览下面的相关文章希望大家以后多多支持七叶笔记!