新建 侦听者类: Observer
package com.test.spring.listener;
import java.util.Map;
public interface Observer {
public void execute(Map<String, Object> paras);
public boolean isAsyn();
}
抽像侦听者
package com.test.spring.listener;
public abstract class AbstractObserver implements Observer {
protected boolean asyn = false;
public boolean isAsyn() {
return asyn;
}
public void setAsyn(boolean asyn) {
this.asyn = asyn;
}
}
一个测试的侦听者:
package com.test.spring.listener.observers;
import java.util.Map;
import com.test.spring.listener.AbstractObserver;
public class Test1 extends AbstractObserver {
@Override
public void execute(Map<String, Object> paras) {
System.out.println("i am here");
System.out.println("thread name Observer:" + Thread.currentThread().getName());
}
}
事件管理类: EventManager
package com.test.spring.listener;
import java.util.List;
import java.util.Map;
public class EventManager {
private Map<String, List<Observer>> events;
public void dispatchEvent(String eventName, Map<String, Object> paras) {
if (events == null || events.isEmpty()) {
return;
}
List<Observer> observers = events.get(eventName);
for(Observer observer : observers) {
if (observer.isAsyn()) {
EventManagerThread eventManagerThread = new EventManagerThread(observer, paras);
Thread thread = new Thread(eventManagerThread);
thread.start();
} else {
observer.execute(paras);
}
}
}
public void setEvents(Map<String, List<Observer>> events) {
this.events = events;
}
}
class EventManagerThread implements Runnable {
private Observer observer;
private Map<String, Object> paras;
public EventManagerThread(Observer observer, Map<String, Object> paras) {
this.observer = observer;
this.paras = paras;
}
@Override
public void run() {
this.observer.execute(paras);
}
}
配置文件 : listener.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> <bean id="eventManager" class="com.test.spring.listener.EventManager"> <property name="events"> <map> <entry key="event1"> <list> <ref bean="test1"/> </list> </entry> </map> </property> </bean> <bean id="test1" class="com.test.spring.listener.observers.Test1"> <property name="asyn" value="false"></property> </bean> </beans>
测试类:
package com.test.spring.listener;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
String[] locations = {"listener.xml"};
ApplicationContext ctx = new ClassPathXmlApplicationContext(locations);
EventManager eventManager = (EventManager)ctx.getBean("eventManager");
System.out.println("thread name main:" + Thread.currentThread().getName());
eventManager.dispatchEvent("event1", null);
}
}