开篇
作为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()等方法内部都是触发事件执行。