开篇
作为Tomcat生命周期的补充,解释下事件的触发。
源码部分
- 每个容器由于继承自LifecycleBase,当容器状态发生变化时都会调用fireLifecycleEvent方法生成LifecycleEvent,并且交由此容器的事件监听器处理。
- 通过addLifecycleListener添加事件监听器添加到全局的lifecycleListeners。
- 通过LifecycleBase的fireLifecycleEvent方法来触发。
public abstract class LifecycleBase implements Lifecycle {private final List<LifecycleListener> lifecycleListeners = new CopyOnWriteArrayList<>();public void addLifecycleListener(LifecycleListener listener) {lifecycleListeners.add(listener);}protected void fireLifecycleEvent(String type, Object data) {LifecycleEvent event = new LifecycleEvent(this, type, data);for (LifecycleListener listener : lifecycleListeners) {listener.lifecycleEvent(event);}}}
事件的触发机制
说明:
- 1、Tomcat的fireLifecycleEvent的上层会通过startInternal()、stopInternal()、setStateInternal()进行调用。
说明:
- 1、setStateInternal()方法内部会调用fireLifecycleEvent()方法。
- 2、在LifecycleBase的内部的init()、stop()、start()、destroy()等方法内部都是触发事件执行。