Tomcat生命周期的实现

时间:2021-05-09 09:04:03

当多个对象存在的时候,对象的创建,对象的销毁,对象与对象之间关系的维护将是很大的问题,容器的引入,我们将对象的创建,对象关系的维护交给容器,即所谓的控制反转。而对于对象生命周期的管理也是由容器进行负责,容器怎么去实现对象生命周期的管理呢?

容器中可能包含很多子容器以及很多组件,tomcat设计思想是入口启动父容器,而它的子容器和组件是由父容器去启动的,当所有的组件和子容器都启动完毕,tomcat也就启动完成。各个组件和容器都去实现Lifecycle接口,那么就要实现接口里的方法,我们看看接口里有哪些方法。

public interface Lifecycle {

    public static final String START_EVENT = "start";
    public static final String BEFORE_START_EVENT = "before_start";
    public static final String AFTER_START_EVENT = "after_start";
    public static final String STOP_EVENT = "stop";
    public static final String BEFORE_STOP_EVENT = "before_stop";
    public static final String AFTER_STOP_EVENT = "after_stop";

    // --------------------------------------------------------- Public Methods
    public void addLifecycleListener(LifecycleListener listener);
    public LifecycleListener[] findLifecycleListeners();
    public void removeLifecycleListener(LifecycleListener listener);
    public void start() throws LifecycleException;
    public void stop() throws LifecycleException;
}

那么很显然最重要的也就是start和stop方法。各个组件和容器提供了这些方法的实现,所以它的父组件可以通过这些方法来启动和停止他们。

并且我们看到,对于生命周期,还存在对于对象生命周期的事件,比如对象创建之前,对象创建,创建之后……即before_start、start、after_start以及对象停止before_stop、stop、after_stop

在这些创建和停止的过程中,我们可以让某个过程去触发某个事件,已达到生命周期的管理与监控。所以,我们如果想要一个组件去触发事件,需要做到:

①组件需要绑定一个监听器

②组件触发事件

③监听器处理事件

LifecycleEvent类

org.apache.catalina.LifecycleEvent表示一个生命周期事件,下面为该类的内容:

public final class LifecycleEvent
extends EventObject {

    public LifecycleEvent(Lifecycle lifecycle, String type) {
        this(lifecycle, type, null);
    }

    public LifecycleEvent(Lifecycle lifecycle, String type, Object data) {
        super(lifecycle);
        this.lifecycle = lifecycle;
        this.type = type;
        this.data = data;
    }
    private Lifecycle lifecycle = null;
    public Object getData() {
        return (this.data);
    }
    public Lifecycle getLifecycle() {
        return (this.lifecycle);
    }
    public String getType() {
        return (this.type);
    }
}

LifecycleListener接口

表示生命周期的监听器

public interface LifecycleListener {
    public void lifecycleEvent(LifecycleEvent event);
}

LifecycleSupport类

这里有两个重要的方法,即:addLifecycleListener、fireLifecycleEvent

addLifecycleListener:添加一个事件监听器

fireLifecycleEvent:激发一个生命周期的事件

看看fireLifecycleEvent方法:

public void fireLifecycleEvent(String type, Object data) {

        LifecycleEvent event = new LifecycleEvent(lifecycle, type, data);
        LifecycleListener interested[] = null;
        synchronized (listeners) {
            interested = (LifecycleListener[]) listeners.clone();
        }
        for (int i = 0; i < interested.length; i++)
            interested[i].lifecycleEvent(event);

    }

可以看出当某个组件调用fireLifecycleEvent,这个方法便会调用:

interested[i].lifecycleEvent(event);这个又是什么呢?他是注册在组件上的监听器的方法,监听器开始工作,对监听到的事件进行处理。

LifecycleSupport类存储所有的生命周期监听器到一个数组中,该数组为listens,它初始化的时候没有任何成员。

private LifecycleListener listeners[] = newLifecycleListener[0];

当一个监听器通过addLifecycleListener方法被添加的时候,一个新的数组(长度比旧数组大1)会被创建。然后旧数组中的元素会被拷贝到新数组中并把新事件添加到数组中。当一个事件被删除的时候,一个新的数组(长度为旧数组-1)的数组会被创建并将所有的元素存储到其中。

fireLifecycleEvent 方法触发一个生命周期事件。首先,它会克隆整个监听器数组,然后它调用每个成员的 lifecycleEvent 方法,传递被触发的事件。一个实现了 Lifecycle 的组件可以使用 LifecycleSupport 类。例如,该程序的SimpleContext 类声明了如下变量

protected LifecycleSupport lifecycle = newLifecycleSupport(this);

SimpleContext 调用LifecycleSupport 的 addLifecycleListener 方法添加一个

生命周期事件:

public voidaddLifecycleListener(LifecycleListener listener) {

lifecycle.addLifecycleListener(listener);

}

要删除一个生命周期监听事件,SimpleContext 调用 LifecycleSupport 类的

removeLifecycleListener 方法。

public voidremoveLifecycleListener(LifecycleListener listener) {

lifecycle.removeLifecycleListener(listener);

}

要触发一个事件,SimpleContext 需要调用 LifecycleSupport 的

fireLifecycleEvent 方法:

lifecycle.fireLifecycleEvent(START_EVENT,null);