/**
* 事件 监听器
* @author Administrator
*
*/
public interface LifecycleListener {
public void lifecycleEvent(LifecycleEvent event);
}
package com.ifeng.learn.listener;
import java.util.EventObject;
/**
*
* @author Administrator
*
*/
public class LifecycleEvent extends EventObject {
private static final long serialVersionUID = 1L;
/**
* 事件类型
*/
String type;
/**
* 数据
*/
Object data;
public LifecycleEvent(Lifecycle lifecycle,String type,Object data){
super(lifecycle);
this.type = type;
this.data = data;
}
public String getType(){
return type;
}
public Object getData(){
return data;
}
}
package com.ifeng.learn.listener;
/**
*
* @author Administrator
* 这是一个接口,应该有具体动作,而执行这个动作前有相应事件
*
* 生命周期有两个动作,start,stop
* 每个动作的执行可能都会触发一些事件
* 而客户端在调用 lifecycle子类的 动作时,事件会在动作子类进行调用
* 因此,子类中得有能触发事件的方法,两种方法:
* 1、lifecycle中只定义两个动作:start stop,然后定义一个事件类(EventSouce),这个事件类负责事件添加、删除、触发等操作,最后定义一个lifecycle的抽象类继承lifecycle与eventSource
* 而下面的子类都直接继承这个抽象类,这样子类中就拿到了触发事件的方法
* 2、前面一种方法是继承,而下一种就是组合了,在lifecycle类引用一个事件管理类对象,通过事件管理类对象进行事件的操作
*
*
*
*/
public interface Lifecycle {
public static final String START_BEFORE_EVENT = "start_before";
public static final String START_EVENT = "start";
public static final String STRAT_AFTER_EVENT = "start_after";
public static final String STOP_BEFORE_EVENT = "stop_before";
public static final String STOP_EVENT = "stop";
public static final String STOP_AFTER_EVENT = "stop_after";
/**
* 三个相应事件
* @param listener
*/
public void addLifecycleListener(LifecycleListener listener);
public LifecycleListener[] getLifecycleListener();
public void removeLifecycleListener(LifecycleListener listener);
public void start();
public void stop();
}
package com.ifeng.learn.listener;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
/**
* 事件管理类
* @author Administrator
*
*/
public final class LifecycleSupport {
private Lifecycle lifecycle;
private List<LifecycleListener> listeners = new CopyOnWriteArrayList<LifecycleListener>();
public LifecycleSupport(Lifecycle lifecycle){
this.lifecycle = lifecycle;
}
public void addLifecycleListener(LifecycleListener listener){
listeners.add(listener);
}
public LifecycleListener[] getLifecycleListener(){
return listeners.toArray(new LifecycleListener[listeners.size()]);
}
public void removeListener(LifecycleListener listener){
if(listener == null)
return ;
listeners.remove(listener);
}
/**
* 对于所有的监听器进行事件触发
* @param event
*/
public void fireEvent(LifecycleEvent event){
if(event == null)
throw new IllegalStateException("event null");
Iterator<LifecycleListener> it = listeners.iterator();
while(it.hasNext()){
it.next().lifecycleEvent(event);
}
}
public void fireEvent(String type,Object data){
LifecycleEvent event = new LifecycleEvent(lifecycle, type, data);
fireEvent(event);
}
}
package com.ifeng.learn.listener;
public class Container implements Lifecycle {
private LifecycleSupport support = new LifecycleSupport(this);
@Override
public void start() {
//将相应事件源进行事件触发
support.fireEvent(Lifecycle.START_EVENT,"hello world");
}
@Override
public void stop() {
// TODO Auto-generated method stub
}
@Override
public void addLifecycleListener(LifecycleListener listener) {
support.addLifecycleListener(listener);
}
@Override
public LifecycleListener[] getLifecycleListener() {
return support.getLifecycleListener();
}
@Override
public void removeLifecycleListener(LifecycleListener listener) {
support.removeListener(listener);
}
public static void main(String arg[]){
Container container = new Container();
container.start();
}
}
tomcat 中的事件监听机制
最新推荐文章于 2023-04-08 17:34:46 发布
本文介绍了Tomcat中的事件监听机制,包括LifecycleListener接口、LifecycleEvent类和LifecycleSupport事件管理类。LifecycleListener接口定义了生命周期事件的处理方法,LifecycleEvent包含事件类型和数据。LifecycleSupport类用于管理监听器,提供添加、获取和移除监听器的方法,并实现事件的触发。示例代码展示了如何在Container类中使用这些机制来触发START_EVENT事件。
摘要由CSDN通过智能技术生成