触发销毁
当我们在独立使用spring框架的时候往往会发现,标注了@PreDestory的方法并没有在进程结束前调用,没有触发生命周期的销毁方法,那么如何去触发销毁的生命周期方法呢?有两种方式
1.调用applicationContext.close(),这种方式可以说是手动的去关闭容器,触发生命周期销毁
2.调用applicationContext.registerShutdownHook(); 这种方式是通过注册一个钩子函数触发生命周期的销毁
其实方式一和方式二都是调用到doClose(),所以接下来看doClose()是如何触发生命中期销毁
doClose()
protected void doClose() {
if (this.active.get() && this.closed.compareAndSet(false, true)) {
LiveBeansView.unregisterApplicationContext(this);
publishEvent(new ContextClosedEvent(this));
if (this.lifecycleProcessor != null) {
this.lifecycleProcessor.onClose();
}
destroyBeans();
closeBeanFactory();
onClose();
if (this.earlyApplicationListeners != null) {
this.applicationListeners.clear();
this.applicationListeners.addAll(this.earlyApplicationListeners);
}
this.active.set(false);
}
}
首先是发布了一个事件,如果有事件监听器就可以直到当前这个spring容器正在关闭
然后就是destoryBeans()这就与本文主题相关了,往底层追溯
public void destroySingletons() {
if (logger.isTraceEnabled())