Java中的事件监听机制主要由事件源、事件对象、事件监听器三个部分组成。java
DoorEvent:事件对象(event object)spring
public class DoorEvent extends EventObject { private String doorState = ""; // 表示门的状态,有“开”和“关”两种 public DoorEvent(Object source) { super(source); } public void setDoorState(String doorState) { this.doorState = doorState; } public String getDoorState() { return this.doorState; } }
IDoorListener:事件监听器(event listener)ide
public interface IDoorListener extends EventListener { //EventListener是全部事件侦听器接口必须扩展的标记接口、由于它是无内容的标记接口、 //因此事件处理方法由咱们本身声明以下: public void dealDoorEvent(DoorEvent event); }
FrontDoorListener:事件监听器(event listener)学习
public class FrontDoorListener implements IDoorListener { /** * 作具体的开门,关门动做 * @param event */ @Override public void dealDoorEvent(DoorEvent event) { if (event.getDoorState()!=null && event.getDoorState().equals("open")) { System.out.println("前门打开"); } else { System.out.println("前门关闭"); } } }
DoorManager:事件源(event source)测试
public class DoorManager { private List<IDoorListener> listeners = new ArrayList(); public void addDoorListener(IDoorListener listener) { synchronized (this) { if (listener != null && !(listeners.contains(listener))) { listeners.add(listener); } } } public void removeDoorListener(IDoorListener listener) { synchronized (this) { if (listeners.contains(listener)) { listeners.remove(listener); } } } public void notifyDoors(DoorEvent event) { for (IDoorListener iDoorListener : listeners) { iDoorListener.dealDoorEvent(event); } } /** * 模拟开门事件 */ public void fireOpend() { if (listeners == null) { return; } DoorEvent event = new DoorEvent(this); event.setDoorState("open"); notifyDoors(event); } }
测试类:this
public class TestMain { public static void main(String[] args) { DoorManager doorManager = new DoorManager(); // 添加监听器 doorManager.addDoorListener(new FrontDoorListener()); doorManager.addDoorListener(new IDoorListener() { @Override public void dealDoorEvent(DoorEvent event) { if (event.getDoorState() != null && event.getDoorState().equals("open")) { System.out.println("后门打开,警示灯亮起"); } else { System.out.println("后门关闭,警示灯熄灭"); } } }); // 模拟事件 System.out.println("模拟门打开事件"); doorManager.fireOpend(); System.out.println("模拟门关闭事件"); DoorEvent doorEvent = new DoorEvent(doorManager); doorEvent.setDoorState("close"); doorManager.notifyDoors(doorEvent); } }
先看使用spring来实现一个简单监听实用的例子:spa
MailSendEvent.Java.net
import org.springframework.context.ApplicationContext; import org.springframework.context.event.ApplicationContextEvent; public class MailSendEvent extends ApplicationContextEvent { private String to; public MailSendEvent(ApplicationContext source, String to) { super(source); this.to = to; } public String getTo() { return this.to; } }
MailSendListener.javacode
import org.springframework.context.ApplicationListener; public class MailSendListener implements ApplicationListener<MailSendEvent>{ public void onApplicationEvent(MailSendEvent event) { MailSendEvent mse = (MailSendEvent) event; System.out.println("MailSendListener:向" + mse.getTo() + "发送完一封邮件"); } }
MailSender.javaxml
public class MailSender implements ApplicationContextAware { private ApplicationContext ctx ; public void setApplicationContext(ApplicationContext ctx) throws BeansException { this.ctx = ctx; } public void sendMail(String to){ System.out.println("MailSender:模拟发送邮件..."); MailSendEvent mse = new MailSendEvent(this.ctx,to); ctx.publishEvent(mse); } }
spring-context.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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean class="com.baobaotao.event.MailSendListener"/> <bean id="mailSender" class="com.baobaotao.event.MailSender"/> </beans>
ApplicationEventTest.java
import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class ApplicatonEventTest { public static void main(String[] args) { String resourceFile = "com/baobaotao/event/beans.xml"; ApplicationContext ctx = new ClassPathXmlApplicationContext(resourceFile); MailSender mailSender = ctx.getBean(MailSender.class); mailSender.sendMail("test mail."); System.out.println("done."); } }
待补充...