有些场景我们需要在Spring 所有的bean 完成初始化后紧接着执行一些任务或者启动需要的异步服务。常见有几种解决方案
-
j2ee 注解 启动前@PostConstruct 销毁前@PreDestroy 基于j2ee 规范
-
springboot 的 org.springframework.boot.CommandLineRunner springboot 特性前面我已经介绍过了
-
spring org.springframework.context.SmartLifecycle
这里介绍一下第三种 SmartLifecycle
SmartLifecycle 不仅仅能在初始化后执行一个逻辑,还能再关闭前执行一个逻辑,比如你一个服务在启动时向服务注册发现中心发一个信号告诉它服务上线了,下线前通知它你下线了。也就是实现了一个 从生到死 的轮回。
话不多说先实现一个SmartLifeCycle
我们发现实现类需要实现3个方法,但是这3个方法并不是SmartLifecycle的方法而是
org.springframework.context.Lifecycle
的方法:
-
void start() 我们主要在该方法中启动任务或者其他异步服务,比如开启MQ接收消息当上下文被刷新(所有对象已被实例化和初始化之后)时,将调用该方法,默认生命周期 处理器将检查每个SmartLifecycle对象的isAutoStartup()方法返回的布尔值。如果为“true”,则该方法会被调用,而不是等待显式调用自己的start()方法,同时当上下文被刷新(所有对象已被实例化和初始化之后)时,将调用该方法,默认生命周期处理器将检查每个SmartLifecycle对象的isAutoStartup()方法返回的布尔值, 如果为true,则该方法会被调用,而不是等待显式调用自己的start()方法,boolean isRunning() 的状态信号也决定此方法是否执行只有当该方法返回false start()方法才会被执行,有兴趣可以看LifecycleProcessor相关实现
-
void stop() 顾名思义 生命周期结束时调用的方法。只有当 boolean isRunning() 方法返回true 该方法才会被执行,该方法是属于Lifecyle接口的,被SmartLifeCycle作为了一个钩子。 实际执行的是SmartLifeCycle中的这个方法
-
boolean isRunning() 作为 信号来判定 start 还是stop
我们来启动一下springboot应用测试一下,下图说明 start在应用启动前执行了
然后我们写一个springmvc 接口来关闭应用,下面的关闭方法写的比较粗糙,当然有更高级的玩法。
我们调用 /life/destroy 方法 ,会出现下面的结果
这里介绍它的一些使用方法和场景,先学会使用,更深层次的留给你自己去挖掘。