java监听器原理_Java中监听器 和Spring监听器简单实现和实现原理

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 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{

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

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">

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.");

}

}

实现原理:

待补充...

参考资料:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值