開篇
作為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()等方法内部都是觸發事件執行。