今天我们来看一下Springboot的关闭过程
关闭入口
当想要关闭Springboot应用,可以执行它启动成功后返回的Context的close方法来关闭
前面我们已经看过Springboot的启动过程 Springboot 启动过程_icodegarden的博客-CSDN博客
在启动过程中我们看到有一个SpringApplicationShutdownHook
这个Hook是在SpringApplication执行run的过程中设置到JVM的
因此当Springboot进程接收到操作系统的退出信号时(例如kill -15 $pid),SpringApplicationShutdownHook就会执行
可以看到SpringApplicationShutdownHook也是通过执行Context的close来关闭的
关闭Context
下面我们来看Context的close过程
这里会发送内容是ReadinessState. REFUSING_TRAFFIC(readness将拒绝)的AvailabilityChangeEvent(可用性变更事件)
继续看super.doClose();
publishEvent(new ContextClosedEvent(this));发送ContextClosedEvent
触发Bean的stop LifeCycle
this.lifecycleProcessor.onClose();将触发所有Lifecycle bean的stop方法
触发Bean的destory LifeCycle
我们继续看super.doClose();的destroyBeans();
这里的disposableBeans都是实现了DisposableBean接口或 具有destroy方法 或 方法具有注解@PreDestroy的bean被DisposableBeanAdapter包装
这里的过程就是执行目标的destroty方法
以下是Spring内置的disposableBeans,一般是一些需要释放资源的bean,例如dataSource
destroyBeans();之后则是清理本地的对象缓存
服务注销
destroy会触发AbstractAutoServiceRegistration.destroy(),将触发例如nacos等注册中心的ServiceRegistry.deregister(R) 方法
结束关闭过程