原理是这样的:
1. 给SimpleContext注册一个事件
在ex06.pyrmont.startup. Bootstrap中:
LifecycleListener listener = new SimpleContextLifecycleListener();
((Lifecycle) context).addLifecycleListener(listener);
实际执行的是:
org.apache.catalina.util. LifecycleSupport:
public void addLifecycleListener(LifecycleListener listener) {
synchronized (listeners) {
LifecycleListener results[] =
new LifecycleListener[listeners.length + 1];
System.out.println("=====listeners.length:"+listeners.length);
for (int i = 0; i < listeners.length; i++)
results[i] = listeners[i];
results[listeners.length] = listener;
System.out.println("=====results.length:"+results.length);
listeners = results;
}
2.通知执行事件
lifecycle.fireLifecycleEvent(AFTER_START_EVENT, null);
实际执行的是:
org.apache.catalina.util. LifecycleSupport:
public void fireLifecycleEvent(String type, Object data) {
LifecycleEvent event = new LifecycleEvent(lifecycle, type, data);
LifecycleListener interested[] = null;
synchronized (listeners) {
interested = (LifecycleListener[]) listeners.clone();
}
System.out.println("========interested.length"+interested.length);
for (int i = 0; i < interested.length; i++)
interested[i].lifecycleEvent(event);
}
3.执行事件
由2中的 interested[i].lifecycleEvent(event);调用:
ex06.pyrmont.core. SimpleContextLifecycleListener中的
public void lifecycleEvent(LifecycleEvent event) {
Lifecycle lifecycle = event.getLifecycle();
System.out.println("SimpleContextLifecycleListener's event " + event.getType().toString());
if (Lifecycle.START_EVENT.equals(event.getType())) {
System.out.println("Starting context.");
}
else if (Lifecycle.STOP_EVENT.equals(event.getType())) {
System.out.println("Stopping context.");
}
}
小结:在上面的三个事件中,请务必记住,我们注册事件是在SimpleContext中,其他的虽然继承了Lifecycle,也回去执行步骤2,但是那个时候2的数组是空的,所以,根本不会去执行步骤3.哈哈,这个也是为什么我先前矛盾了,怎么看都看不懂,外国人的书,就是不爽。