1.LifyCycleListener 是观察者接口
只有一个方法 lifecycleEvent() ,由被观察者触发
2.LifecycleBase 是被观察者父类,实现的是 lifecycle 接口,tomcat 的各容器都是继承这个父类的
standardServer等容器 触发事件:lifecycle.fireLifecycleEvent(type, data);
3. 被观察者对象 注册观察者对象
/**
* Add a lifecycle event listener to this component.
*
* @param listener The listener to add
*/
public void addLifecycleListener(LifecycleListener listener) {
synchronized (listenersLock) {
LifecycleListener results[] =
new LifecycleListener[listeners.length + 1];
for (int i = 0; i < listeners.length; i++)
results[i] = listeners[i];
results[listeners.length] = listener;
listeners = results;
}
}
每个被观察者维护的是一个多例的观察者列表。
对于一个被观察者触发的事件 ,所有被观察者注册的观察者都会收到这个事件
/**
* Notify all lifecycle event listeners that a particular event has
* occurred for this Container. The default implementation performs
* this notification synchronously using the calling thread.
*
* @param type Event type
* @param data Event data
*/
public void fireLifecycleEvent(String type, Object data) {
LifecycleEvent event = new LifecycleEvent(lifecycle, type, data);
LifecycleListener interested[] = listeners;
for (int i = 0; i < interested.length; i++)
interested[i].lifecycleEvent(event);
}
如果这个观察者发现是它关注的事件,那么处理该事件