您的位置:首页 > 编程语言 > Java开发

spring的事件监听机制的简化实现

2018-03-19 20:57 453 查看
import java.util.EventListener;
import java.util.EventObject;
import java.util.LinkedHashSet;
import java.util.Set;

/**
* spring的事件模式
*/
public class SpringListener{

public static void main(String args[]){
ApplicationContext appliactionContext = new ApplicationContext();
//添加监听是AbstractApplicationContext在refresh()方法内调用registerListeners();
appliactionContext.addApplicationListener(new ApplicationListener(){
@Override
public void onApplicationEvent(ApplicationContextEvent event) {
if(event instanceof ContextClosedEvent){
System.out.println("容器关闭了");
//...从事件拿到事件源干活
}else if(event instanceof ContextStartedEvent){
System.out.println("容器启动了");
//...从事件拿到事件源干活
}
}
});
appliactionContext.start();
appliactionContext.stop();
}

}

//事件发布接口
interface ApplicationEventPublisher {
void publishEvent(ApplicationContextEvent event);
}
//事件源
class ApplicationContext implements ApplicationEventPublisher{

private Set<ApplicationListener<?>> applicationListeners = new LinkedHashSet<ApplicationListener<?>>();

void addApplicationListener(ApplicationListener listener) {
this.applicationListeners.add(listener);
}

@Override
public void publishEvent(ApplicationContextEvent event) {
//监听器的集合处理事件
for (ApplicationListener<?> applicationListener : applicationListeners) {
applicationListener.onApplicationEvent(event);
}
}

//启动动作,调用发布事件,并传入启动的事件
public void start() {
publishEvent(new ContextStartedEvent(this)); //this即是本类即是事件源
}

//关闭动作, 调用发布事件,并传入关闭的事件
public void stop() {
publishEvent(new ContextClosedEvent(this));
}

}

//事件监听器
interface ApplicationListener<E extends ApplicationContextEvent> extends EventListener {
void onApplicationEvent(ApplicationContextEvent event);
}

//事件的抽象类
abstract class ApplicationContextEvent extends EventObject {
private static final long serialVersionUID = 7099057708183571937L;
public ApplicationContextEvent(Object source) {
super(source);
}
}
//容器关闭的事件
class ContextClosedEvent extends ApplicationContextEvent {
public ContextClosedEvent(ApplicationContext source) {
super(source);
}
}
//容器启动的事件
class ContextStartedEvent extends ApplicationContextEvent {
public ContextStartedEvent(ApplicationContext source) {
super(source);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: