Lifecycle接口
Tomcat通过org.apache.catalina.Lifecycle接口统一管理生命周期,所有有生命周期的组件都要实现Lifecycle接口,Lifecycle接口共做了4件事
1.定义了13个String类型常量,用于LifecycleEvent事件的type属性中,作用是区分组件发出的LifecycleEvent事件时的状态(如初始化前、启动前、启动中等)。这种设计方式可以让多种状态都发送同一种类型的事件(LifecycleEvent)然后用其中的一个属性来区分状态而不用定义多种事件,我们要学习和借鉴这种方式
2.定义了三个管理监听器的方法addLifecycleListener、findLifecycleListener和 removeLifecycleListener,分别用来添加、查找和删除LifecycleListener类型的监听器
3.定义了4个生命周期的方法:init、start、stop和destroy,用于执行生命周期的各个阶段的操作
4.定义了获取当前状态的两个方法getState和getStateName,用来获取当前状态
LifecycleBase
Lifecycle接口的默认实现是org.apache.catalina.util.LifecycleBase,所有实现了生命周期的组件都直接或间接地继承自LifecycleBase,LifecycleBase为Lifecycle里的接口方法提供了默认实现:监听串成管理是专门使用了一个LifecycleSupport类来完成的,LifecycleSupport中定义了一个LIfecycleListener数据类型的属性来保存所有的监听器,然后并定义了添加,删除、查找和执行监听的方法
//org.apache.catalina.util.LifecycleSupport
//用于保存监听器
private LifecycleListener listeners[] = new LifecycleListener[0];
//当监听器发生变化时进行同步的同步锁
private final Object listenersLock = new Object();
//添加一个监听器
public void addLifecycleListener(LifecycleListener listener){
synchronized(listenersLock){
LifecycleListener results[] = new LifecycleListener[listener.length + 1];
for(int i=0;i<listeners.length;i++){
results[i] = listeners[i];
}
results[listeners.length] = listener;
listeners = results;
}
}
//获取所有监听器
public LifecycleListener[] findLifecycleListeners(){
return listeners;
}
//删除一个监听器
public void removeLifecycleListener(LifecycleListener listener){
synchronized(listenersLock){
int n = -1;
for(int i=0;i<listeners.length;i++){
if(listeners[i]==listener){
n = i;
break;
}
}
if(n<0){
return;
}
LifecycleListener results[] = new LifecycleListener[listeners.length - 1];
int j = 0;
for(int i =0;i<listeners.length;i++){
if(i!=n){
results[j++] = listeners[i];
}
}
listeners = results;
}
}