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."); } }
待補充...