当多个对象存在的时候,对象的创建,对象的销毁,对象与对象之间关系的维护将是很大的问题,容器的引入,我们将对象的创建,对象关系的维护交给容器,即所谓的控制反转。而对于对象生命周期的管理也是由容器进行负责,容器怎么去实现对象生命周期的管理呢?
容器中可能包含很多子容器以及很多组件,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);