天天看點

TOMCAT源碼分析-事件與監聽

開篇

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

繼續閱讀