Java中的事件监听使用
Java中的事件监听机制主要由事件源、事件对象、事件监听器三个部分组成。
DoorEvent:事件对象(event object)
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)
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);
}
}
测试类:
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中监听器使用
先看使用spring来实现一个简单监听实用的例子:
MailSendEvent.Java
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.java
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.java
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.");
}
}
实现原理:
待补充...
参考资料: